CASE式で条件分岐 — 値を振り分ける

SQLのCASE式で、条件に応じて値を振り分ける方法を解説します。単純CASEと検索CASEの違い、集計との組み合わせ(条件付き集計)まで、具体例で整理します。

「給料が 600 以上なら高、それ以外は並」のように、条件によって出力する値を切り替えたいことがあります。プログラミングの if 文にあたるのが、SQL の CASE 式です。SELECT の列や集計の中で使えて、表現の幅がぐっと広がります。

基本の形(検索 CASE)

もっともよく使うのが、条件を並べて書く「検索 CASE」です。

query.sql
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 の方が簡潔です。

query.sql
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 の真価は集計と組み合わせたときに出ます。「部門ごとの人数」ではなく「条件に合う人だけを数える」ことができます。

query.sql
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 で作った区分ごとに集計することもできます。

query.sql
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;

SELECTGROUP BY の両方に同じ CASE を書く必要がある点に注意してください(多くのデータベースでは列の別名を GROUP BY に書けないため)。

まとめ

  • CASE は SQL の条件分岐(if にあたる)
  • 検索 CASE(WHEN 条件)は範囲や複雑な条件、単純 CASE(WHEN 値)は等価比較に向く
  • END で締める。ELSE 省略時は NULL
  • 集約と組み合わせると「条件に合う行だけの集計」ができる

CASE 式を使いこなせると、1 つのクエリで表現できることが大きく広がります。データを見やすく整えたいときの強力な道具です。

手を動かして確認しましょう「SELECT の基本」の演習問題で、実際に SQL を書いて自動採点できます。
問題一覧へ →