CASE式で条件分岐 — 値を振り分ける
SQLのCASE式で、条件に応じて値を振り分ける方法を解説します。単純CASEと検索CASEの違い、集計との組み合わせ(条件付き集計)まで、具体例で整理します。
「給料が 600 以上なら高、それ以外は並」のように、条件によって出力する値を切り替えたいことがあります。プログラミングの if 文にあたるのが、SQL の CASE 式です。SELECT の列や集計の中で使えて、表現の幅がぐっと広がります。
基本の形(検索 CASE)
もっともよく使うのが、条件を並べて書く「検索 CASE」です。
SELECT
name,
salary,
CASE
WHEN salary >= 600 THEN '高'
WHEN salary >= 500 THEN '中'
ELSE '並'
END AS 給料ランク
FROM employees;WHEN 条件 THEN 値 を上から順に評価し、最初に真になった条件の値を返します。どれにも当てはまらなければ ELSE の値になります(ELSE を省略すると NULL)。END で締めるのを忘れないようにしましょう。
単純 CASE
1 つの列の値が「A なら〜、B なら〜」と決まっている場合は、単純 CASE の方が簡潔です。
SELECT
name,
CASE dept
WHEN 'Dev' THEN '開発'
WHEN 'Sales' THEN '営業'
WHEN 'HR' THEN '人事'
ELSE 'その他'
END AS 部門名
FROM employees;CASE 列 WHEN 値 THEN ... の形で、列の値と各 WHEN の値が等しいかを比べます。等価比較だけならこちらが読みやすく、範囲や複雑な条件を書きたいときは検索 CASE を使う、と覚えておくとよいでしょう。
条件付き集計(CASE × 集約)
CASE の真価は集計と組み合わせたときに出ます。「部門ごとの人数」ではなく「条件に合う人だけを数える」ことができます。
SELECT
COUNT(*) AS 全体,
COUNT(CASE WHEN salary >= 600 THEN 1 END) AS 高給者数,
SUM(CASE WHEN dept = 'Dev' THEN salary ELSE 0 END) AS 開発部給料合計
FROM employees;COUNT(CASE WHEN 条件 THEN 1 END) は、条件に合う行だけ 1 を返し(合わなければ NULL)、COUNT が NULL を無視する性質を使って「条件に合う件数」を数えています。この「行を横方向に振り分けて集計する」テクニックは、クロス集計を作るときにも役立ちます。
GROUP BY と組み合わせる
CASE で作った区分ごとに集計することもできます。
SELECT
CASE
WHEN salary >= 600 THEN '高'
WHEN salary >= 500 THEN '中'
ELSE '並'
END AS ランク,
COUNT(*) AS 人数
FROM employees
GROUP BY
CASE
WHEN salary >= 600 THEN '高'
WHEN salary >= 500 THEN '中'
ELSE '並'
END;SELECT と GROUP BY の両方に同じ CASE を書く必要がある点に注意してください(多くのデータベースでは列の別名を GROUP BY に書けないため)。
まとめ
CASEは SQL の条件分岐(ifにあたる)- 検索 CASE(
WHEN 条件)は範囲や複雑な条件、単純 CASE(WHEN 値)は等価比較に向く ENDで締める。ELSE省略時は NULL- 集約と組み合わせると「条件に合う行だけの集計」ができる
CASE 式を使いこなせると、1 つのクエリで表現できることが大きく広がります。データを見やすく整えたいときの強力な道具です。