Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

CASE

条件によって返す値を切り替える式です。プログラミング言語の 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 列名 = 値』と等価です。
サンプルコード
-- 給与の水準をラベルで表示します(検索CASE)。
SELECT name, salary,
    CASE
        WHEN salary >= 400000 THEN '高給'
        WHEN salary >= 250000 THEN '標準'
        ELSE '要確認'
    END AS salary_level
FROM employees;

-- 部署コードを部署名に変換します(単純CASE)。
SELECT name,
    CASE dept_code
        WHEN 1 THEN '営業部'
        WHEN 2 THEN '開発部'
        WHEN 3 THEN '総務部'
        ELSE 'その他'
    END AS department
FROM employees;

-- CASE を集計と組み合わせて部署別の人数を横展開します。
SELECT
    SUM(CASE WHEN department = '営業部' THEN 1 ELSE 0 END) AS sales,
    SUM(CASE WHEN department = '開発部' THEN 1 ELSE 0 END) AS development,
    SUM(CASE WHEN department = '総務部' THEN 1 ELSE 0 END) AS general_affairs
FROM employees;
実行結果
-- SELECT name, salary, CASE ... END AS salary_level FROM employees; の結果例
-- +----------+--------+--------------+
-- | name     | salary | salary_level |
-- +----------+--------+--------------+
-- | 田中太郎 | 450000 | 高給         |
-- | 鈴木花子 | 280000 | 標準         |
-- | 佐藤一郎 | 200000 | 要確認       |
-- +----------+--------+--------------+
データベース別の書き方

『CASE』式は標準SQLであり、MySQL・PostgreSQL・Oracle・SQL Server・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』も活用できます。

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