言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. CASE

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 が返ります。
ENDCASE 式の終端を示します。必ず記述します。
CASE 列名 WHEN 値列の値と直接比較する単純CASE式です。検索CASEの『WHEN 列名 = 値』と等価です。

サンプルコード

以下の『employees』テーブルを例に説明します。

employees id name dept_code salary 1 狡噛慎也 2 450000 2 常守朱 1 280000 3 宜野座伸元 1 200000 3 rows in set

給与の水準をラベルで表示します(検索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』も活用できます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。