【SQL】CASEを使用して条件分岐する方法をわかりやすく解説
SQLを使用してデータを抽出するとき、特定のカラムの値に応じて条件分岐処理をすることができます。
例)新たなカラム「judge」を作って「score」の値に応じて以下のような判定をしたい。
score | judge |
100 | 合格(満点) |
50点以上 | 合格 |
49点以下 | 補習 |
NULL | 未判定 |
このような場合「CASE」式を使って実現することができます。それでは「CASE」の使用方法をわかりやすく解説していきます。※コードのみ参照したい方は「3-2 検索CASE式のサンプルコード」をご覧ください。
目次
1.CASE式とは 〜使いどころ〜
簡単にいえば条件分岐ができます。CASE式は構文を覚えれば簡単に記述でき、様々な応用が可能です。SELECT文、UPDATE文など様々なSQLクエリの中で利用可能です。
2.CASE式の構文
CASE式には「単純CASE式」と「検索CASE式」があり、記述方法が少し異なります。構文は以下のとおりです。具体例については次章で解説します。
###–###–### 単純CASE式の構文 ###–###–###
指定したカラムの値(条件)に基づき、結果を返します。<条件A が 結果A だったら・・>というように検索条件はイコールのみで評価します。
CASE [検索対象のカラム名] WHEN [条件A] THEN [結果A] WHEN [条件B] THEN [結果B] ELSE [結果C(条件A・条件Bに該当しない時)] END
###–###–### 検索CASE式の構文 ###–###–###
検索CASE式では条件式を記述することができます。イコール以外にも不等号やNULL値の評価なども可能で、単純CASE式より複雑な条件分岐ができます。
CASE WHEN [検索対象カラム名] = [検索条件A] THEN [結果A] WHEN [検索対象カラム名] = [検索条件B] THEN [結果B] ELSE [結果C(条件A・条件Bに該当しない時)] END
3.具体的な使用方法とサンプルコード
では実際に単純ケース式と検索ケース式のサンプルコードを見ていきましょう。
3-1.単純CASE式と検索CASE式
検索対象のカラムが検索条件と「イコール」であるかを判定するケースでは単純ケース式が利用できます。以下のテーブルを使ってコードを記述してみましょう。
++ サンプルテーブル ++ table名:flower
+——————–+——–+———-+——-+
| name | color | quantity | price |
+——————–+——–+———-+——-+
| チューリップ | Red | 50 | 250 |
| バラ | White | 26 | 400 |
| ユリ | White | 22 | 350 |
| ひまわり | yellow | 10 | 300 |
+——————–+——–+———-+——-+
次のような条件でSQL文を記述してみます。
カラム「color」の値が「Red」なら「赤」を返す
カラム「color」の値が「White」なら「白」を返す
カラム「color」の値が それ以外 なら「その他」を返す
◆単純CASE式の場合 CASE color WHEN 'red' THEN '赤' WHEN 'white' THEN '白' ELSE 'その他' END as 色 ◆検索CASE式の場合 CASE WHEN color = 'red' THEN '赤' WHEN color = 'white' THEN '白' ELSE 'その他' END as 色
++ 実行結果 ++
+——————–+——–+———-+——-+———–+
| name | color | quantity | price | 色 |
+——————–+——–+———-+——-+———–+
| チューリップ | Red | 50 | 250 | 赤 |
| バラ | White | 26 | 400 | 白 |
| ユリ | White | 22 | 350 | 白 |
| ひまわり | yellow | 10 | 300 | その他 |
+——————–+——–+———-+——-+———–+
上記2つのクエリは同じ意味、同じ結果となります。
3-2.検索CASE式のサンプルコード
検索CASE式の書き方をもう少し見ていきます。サンプルテーブル「seiseki」を利用して次のような判定をするクエリを記述します。
例)新たなカラム「judge」を作って「score」の値に応じて以下のような判定をしたい。
score | judge |
100 | 合格(満点) |
50点以上 | 合格 |
49点以下 | 補習 |
NULL | 未判定 |
++ サンプルテーブル ++ table名:seiseki
+—-+—————–+——-+——–+
| ID | name | score | bikou |
+—-+—————–+——-+——–+
| 1 | 春田さくら | 100 | NULL |
| 2 | 夏木海斗 | NULL | 欠席 |
| 3 | 秋山りんご | 85 | NULL |
| 4 | 冬下雪彦 | 18 | NULL |
| 5 | 梅雨川あめ | 96 | NULL |
+—-+—————–+——-+——–+
イコールのみでは条件判定ができないため検索CASE式を使います。
SELECT ID ,name ,score ,CASE WHEN score = 100 THEN '合格(満点)' WHEN score >= 50 THEN '合格' WHEN score > 0 THEN '補習' ELSE '未判定' END as judge FROM seiseki
++ 実行結果 ++
+—-+—————–+——-+——————–+
| ID | name | score | judge |
+—-+—————–+——-+——————–+
| 1 | 春田さくら | 100 | 合格(満点) |
| 2 | 夏木海斗 | NULL | 未判定 |
| 3 | 秋山りんご | 85 | 合格 |
| 4 | 冬下雪彦 | 18 | 補習 |
| 5 | 梅雨川あめ | 96 | 合格 |
| 6 | 青木春子 | 50 | 合格 |
| 7 | 渡辺なつ | 49 | 補習 |
| 8 | 田中秋生 | 99 | 合格 |
+—-+—————–+——-+——————–+
4.IF文との使い分けについて
IF文(SQLServerでは「IIF」)では、条件をネスト(入れ子に)すると可読性が低下しますが、単純な分岐であればIF文の方が読みやすい場合もあります。一方CASE文はSELECT・UPDATE・DELETE・SET・IN・WHEREなど様々な句で使用できます。一概にどちらが良いということではありませんので状況に応じて使い分けてください。
5.CASE式使用時の注意点
CASE式を使う際は、以下の点を頭に入れておくとよいでしょう。
- WHEN句は「真」になる条件が見つかったら以降のWHEN句は評価されない
- 条件は排他的に記述する
- 「ELSE」は省略可能だが、予期しない結果となること防ぐため記述した方が良い
- データに「NULL」値を含む場合、想定しない結果となる可能性がある。
- 「IS NULL」等を利用して正しく評価されるように留意する。
6.まとめ
CASE式の使い方について初心者向けに解説しました。慣れればとても応用が効きますので、様々な条件で試してみていただければと思います。最後までお読みいただき、ありがとうございました。
【動作検証DB】
mySQL 8.0.39
【参考サイト】
コメント