CASE
| 対応: | SQL-92(1992) |
|---|
条件によって返す値を切り替える式です。プログラミング言語の if 文や switch 文に相当する機能をSQLの中で実現します。
構文
検索CASE(条件式で分岐します)。
SELECT CASE
WHEN 条件1 THEN 値1
WHEN 条件2 THEN 値2
ELSE デフォルト値
END AS 別名
FROM テーブル名;
単純CASE(値を比較して分岐します)。
SELECT CASE 列名
WHEN 値1 THEN 結果1
WHEN 値2 THEN 結果2
ELSE デフォルト値
END AS 別名
FROM テーブル名;
構文一覧
| 構文 | 概要 |
|---|---|
| CASE WHEN 条件 THEN 値 | 条件が真のときに返す値を指定します。複数の WHEN を並べて条件を追加できます。 |
| ELSE 値 | どの WHEN 条件にも一致しなかった場合に返す値を指定します。省略すると NULL が返ります。 |
| END | CASE 式の終端を示します。必ず記述します。 |
| CASE 列名 WHEN 値 | 列の値と直接比較する単純CASE式です。検索CASEの『WHEN 列名 = 値』と等価です。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
給与の水準をラベルで表示します(検索CASE)。
sample_case.sql
SELECT name, salary,
CASE
WHEN salary >= 400000 THEN '高給'
WHEN salary >= 250000 THEN '標準'
ELSE '要確認'
END AS salary_level
FROM employees;
+------------+--------+--------------+ | name | salary | salary_level | +------------+--------+--------------+ | 狡噛慎也 | 450000 | 高給 | | 常守朱 | 280000 | 標準 | | 宜野座伸元 | 200000 | 要確認 | +------------+--------+--------------+ 3 rows in set
部署コードを部署名に変換します(単純CASE)。
sample_case.sql
SELECT name,
CASE dept_code
WHEN 1 THEN '監視官'
WHEN 2 THEN '執行官'
WHEN 3 THEN '分析官'
ELSE 'その他'
END AS department
FROM employees;
+------------+----------+ | name | department | +------------+----------+ | 狡噛慎也 | 執行官 | | 常守朱 | 監視官 | | 宜野座伸元 | 監視官 | +------------+----------+ 3 rows in set
以下は発展的な使い方です。CASE を集計と組み合わせて部署コード別の人数を横展開します。
sample_case.sql
SELECT
SUM(CASE WHEN dept_code = 1 THEN 1 ELSE 0 END) AS dept_1,
SUM(CASE WHEN dept_code = 2 THEN 1 ELSE 0 END) AS dept_2,
SUM(CASE WHEN dept_code = 3 THEN 1 ELSE 0 END) AS dept_3
FROM employees;
+--------+--------+--------+ | dept_1 | dept_2 | dept_3 | +--------+--------+--------+ | 2 | 1 | 0 | +--------+--------+--------+ 1 row in set
データベース別の書き方
『CASE』式は標準SQLであり、MySQL・PostgreSQL・SQLite のすべてで共通して使用できます。
SELECT name, salary,
CASE
WHEN salary >= 400000 THEN '高給'
WHEN salary >= 250000 THEN '標準'
ELSE '要確認'
END AS salary_level
FROM employees;
概要
『CASE』式はSELECT句・WHERE句・ORDER BY句・GROUP BY句のどこでも使用できます。値を返す「式」であるため、列の値と同様に集計関数の引数や演算式の一部として利用できます。
検索CASEは不等号や範囲条件など任意の条件が書けるため、単純CASEより汎用性があります。単純CASEは『=』比較のみで、コードを値に変換するような場面で読みやすく記述できます。
NULL値を別の値に置き換えるには『COALESCE / NULLIF』も活用できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。