【SQL】5分でわかるCASE式!SELECTもUPDATEも自在に条件分岐させよう

みなさんこんにちは!フリーランスプログラマーのsatoです。

SQL文の中で、条件分岐ができたらいいなぁ…

SQLを触り始めた人は、みんなそんなことを考えると思います。自分もそうでした。

でも実は「CASE」を使用することで簡単に実現できるんです!今回はそんな「CASE」について学びましょう。

  • [基本]「CASE」とは
  • [基本]「CASE」を使ってみよう
  • [応用]「CASE」の応用的な使い方

前半で基本的な使い方をマスターし、後半では、応用的な使い方も見ていきましょう。特にUPDATEと組み合わせた使い方は是非とも覚えていただきたいですね!それではよろしくお願いいたします。

目次

「CASE」とは

まずCASEとは、一言で言えば「条件分岐を行うための命令」と言えるでしょう。非常に簡単に書けますし、SELECTだけでなくUPDATEでも使用することもできるため、汎用性にも長けます。

是非今回覚えてしまっておいてほしい命令です。早速使い方いついて見ていきましょう。

「CASE」を使ってみよう

では早速使ってみましょう。

サンプルテーブル

今回はこんなテーブルを用意しました。これを使用して、条件文の扱い方を見ていきましょう。

userテーブル:

+------+--------+-------+
| id   | name   | point |
+------+--------+-------+
|    1 | 山田   |    80 |
|    2 | 鈴木   |    90 |
|    3 | 加藤   |    60 |
|    4 | 田中   |    70 |
+------+--------+-------+

基本的な使い方

では早速、基本的な使い方を見ていきましょう。基本的な扱い方は以下の通りです。

SELECT
  CASE
      WHEN [条件] THEN [条件を満たしたら表示する内容]
      ELSE [条件を満たしていなかったら表示する内容]
  END
FROM [テーブル名];

CASEを使うには「CASE」と「END」で囲んだ中に、条件を記載しましょう。そして条件を指定しているのは以下の箇所です。

WHEN [条件] THEN [条件を満たしたら表示する内容]

またこの条件は複数書くことで、複数指定することも可能です。最後に、どれにも当てはまらなかった場合の処理をELSEを使って書きましょう。

基本的な使い方

では実際に実例を通して見ていきましょう。以下の命令は、90点以上・80点以上・それ以外の人で分岐し、それぞれ文字を表示した時の例です。

実行命令:

SELECT
  name,point,
  CASE
      WHEN 90 <= point THEN "合格(ラクラク)"
      WHEN 80 <= point THEN "合格(ギリギリ)"
      ELSE "不合格"
  END
FROM user;

実行結果:

+--------+-------+--------------------+
| name   | point | [条件式]            |
+--------+-------+--------------------+
| 山田   |    80 | 合格(ギリギリ)        |
| 鈴木   |    90 | 合格(ラクラク)        |
| 加藤   |    60 | 不合格               |
| 田中   |    70 | 不合格               |
+--------+-------+--------------------+

ちゃんと条件分岐し、それぞれのpointごとの表示を実現できていますね!

式を省略した書き方

CASEの真後ろに、要素名を指定することで、式を書かずに分岐させることも可能です。その場合、WHENの後ろに指定した情報が、先ほどの要素名と「=」ならば条件を満たしたことになります。

実行命令:

SELECT
  name,
  CASE name
      WHEN "山田" THEN "山田です"
      ELSE "山田ではありません"
  END
FROM user;

実行結果:

+--------+------------------------+
| name   | [条件式]               |
+--------+------------------------+
| 山田   | 山田です                 |
| 鈴木   | 山田ではありません         |
| 加藤   | 山田ではありません         |
| 田中   | 山田ではありません         |
+--------+-------------------------+

この使い方も、ぜひ覚えておいてください。

「CASE」の応用的な使い方

ここから先は、さらにCASEを使いこなすための技術を見ていきましょう。

「LIKE」でワイルドカードも使用可能

LIKEを使用すると、曖昧判定が行えます。これを使用すると条件分岐で、様々なことができますよ!以下の例は、名前に「山」がつく人と、つかない人で条件分岐させた例です。

実行命令:

SELECT
  name,
  CASE
      WHEN name LIKE "%山%" THEN "山がつく"
      ELSE "山がつかない"
  END
FROM user;

実行結果:

+--------+-----------------------+
| name   | [条件式]               |
+--------+-----------------------+
| 山田   | 山がつく                |
| 鈴木   | 山がつかない             |
| 加藤   | 山がつかない             |
| 田中   | 山がつかない             |
+--------+-----------------------+

なかなか便利そうではないでしょうか。LIKEについては以下のリンクでまとめてありますので、是非学んでみましょう。

入れ子にもできる!

CASEの中にCASEを記述することも可能です。例えば、加藤君だけを対象として、再度合格判定をしたとしましょう。それを実現するなら以下のような書き方となります。

実行命令:

SELECT
  name,
  CASE
      WHEN name="加藤" THEN
        CASE
            WHEN 80 <= point THEN "合格"
            ELSE "不合格"
        END
      ELSE "対象ではない"
  END
FROM user;

実行結果:

+--------+--------------------+
| name   | [条件式]            |
+--------+--------------------+
| 山田   | 対象ではない          |
| 鈴木   | 対象ではない          |
| 加藤   | 不合格               |
| 田中   | 対象ではない          |
+--------+--------------------+

最初のCASEで、加藤君かどうかを判別し、その内部で点数を判定していますね!このように入れ子にすることも可能です。

ただし深くしすぎると、わかりづらい式となってしまいますのでほどほどにするようにも気をつけましょう。

なんと「UPDATE」でも使用可能!

UPDATEの内部に記述することも可能です!以下の例は、たとえば80点未満の人は0点に、それ以上の人は点数を倍にするという場合の例です。

実行命令:

UPDATE user SET
  point =
    CASE
        WHEN 80 <= point THEN point*2
        ELSE 0
    END;

UPDATEのあと、全検索した結果:

+------+--------+-------+
| id   | name   | point |
+------+--------+-------+
|    1 | 山田   |   160 |
|    2 | 鈴木   |   180 |
|    3 | 加藤   |     0 |
|    4 | 田中   |     0 |
+------+--------+-------+

「point = CASE [条件式など]」といった形式で記述するわけですね!これも有用な技なので覚えておきましょう。

まとめ

今回は「CASE」について学びました。CASEはSQL上で、条件分岐させることができる、すごい命令です。是非マスターしておくことで、とっさに複雑な命令を打てるようにしておけると良いですね!役立つこと間違いなしです!

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次