🔖

【SQL】CASE WHEN の基本構文と使い方を解説

に公開

はじめに

SQLでは、条件に応じて異なる値を返したい場面がよくあります。

例えば、

  • 数値に応じて「評価」を表示したい
  • フラグに応じて「ステータス名」を切り替えたい

そんなときに便利なのが CASE WHEN です。

本記事では、CASE WHEN の基本構文と使いどころ、注意点について解説します。

1. 基本構文

CASE WHEN は、条件ごとに値を分岐させることができる構文です。

SELECT
  カラム名,
  CASE
    WHEN 条件1 THEN1
    WHEN 条件2 THEN2
    ELSE デフォルト値
  END AS 別名
FROM テーブル名;
  • ELSE は省略可能です(すべての条件に当てはまらなかった場合は NULL が返されます)
  • END の後に別名(AS)を付けるのが一般的です

2. 実例①:点数に応じた評価を表示する

以下のような students テーブルがあるとします。

+--------+--------+
| name   | score  |
+--------+--------+
| Alice  | 85     |
| Bob    | 72     |
| Carol  | 58     |
+--------+--------+

この点数に応じて「合格」「追試」「不合格」を判定したい場合:

SELECT
  name,
  score,
  CASE
    WHEN score >= 80 THEN '合格'
    WHEN score >= 60 THEN '追試'
    ELSE '不合格'
  END AS 判定
FROM students;

実行結果:

+--------+--------+----------+
| name   | score  | 判定     |
+--------+--------+----------+
| Alice  | 85     | 合格     |
| Bob    | 72     | 追試     |
| Carol  | 58     | 不合格   |
+--------+--------+----------+

3. 実例②:フラグ値をラベルに変換する(NULL対応版)

以下の users テーブルでは、is_active フラグが 1(有効)、0(無効)、または NULL(未設定)で管理されているとします。

+---------+-----------+
| name    | is_active |
+---------+-----------+
| Ken     | 1         |
| Mary    | 0         |
| Alex    | NULL      |
+---------+-----------+
SELECT
  name,
  CASE
    WHEN is_active = 1 THEN '有効'
    WHEN is_active = 0 THEN '無効'
    ELSE '不明'
  END AS ステータス
FROM users;

実行結果:

+-------+----------+
| name  | ステータス |
+-------+----------+
| Ken   | 有効     |
| Mary  | 無効     |
| Alex  | 不明     |
+-------+----------+

4. 集計関数と組み合わせる

CASE WHENCOUNT, SUM などの集計関数と組み合わせてもよく使われます。

例えば、gender 列を持つ users テーブルがあるとします。

+---------+--------+
| name    | gender |
+---------+--------+
| Ken     | M      |
| Mary    | F      |
| Alex    | NULL   |
| Alice   | F      |
| Bob     | M      |
+---------+--------+
SELECT
  CASE
    WHEN gender = 'M' THEN '男性'
    WHEN gender = 'F' THEN '女性'
    ELSE '不明'
  END AS 性別,
  COUNT(*) AS 人数
FROM users
GROUP BY gender;

実行結果:

+--------+--------+
| 性別   | 人数    |
+--------+--------+
| 男性   | 2      |
| 女性   | 2      |
| 不明   | 1      |
+--------+--------+

5. 注意点:条件の順番が大事

CASE は上から順に条件を評価していくため、より具体的な条件を上に書くことが重要です。

-- 正しい例(大きい順)
WHEN score >= 80 THEN 'A'
WHEN score >= 60 THEN 'B'
-- NG例(小さい順に書くと、最初の条件に全て当てはまり後の条件が無視されてしまいます)
WHEN score >= 60 THEN 'C'
WHEN score >= 80 THEN 'A'

6. 補足:知っておくと便利な使い方

SELECT 以外でも使える

CASE WHENSELECT 句だけでなく、ORDER BYWHEREHAVING 句などでも使えます。

たとえば、「スコアが存在する学生だけを対象に、スコアが一定以上かどうかでフィルターしたい」といった条件を CASE WHEN で書くこともできます。

SELECT name, score
FROM students
WHERE
  CASE
    WHEN score IS NULL THEN 0
    WHEN score >= 80 THEN 1
    ELSE 0
  END = 1;

NULL を除外しつつ、80 点以上の人だけを取得したいときなど、複数の条件をまとめて書けるのが利点です。

🔍 補足:条件が増えると効果的

条件が1〜2個の場合は、次のように ANDOR で書いた方がわかりやすいかもしれません。

-- 実際にはこちらの方が読みやすく、パフォーマンスも良い
SELECT name, score
FROM students
WHERE score IS NOT NULL AND score >= 80;

ただし、条件が多くなったり、動的に組み立てる場合は、CASE WHEN にまとめる方が柔軟に対応できます。用途に応じて使い分けるのがおすすめです。

簡略形(単一カラムへの分岐)

条件がすべて「1つのカラムに対する比較」の場合、CASE カラム名 WHEN 値 THEN〜 という省略形も使えます。

SELECT
  name,
  CASE is_active
    WHEN 1 THEN '有効'
    WHEN 0 THEN '無効'
    ELSE '不明'
  END AS ステータス
FROM users;

条件がシンプルな場合には、構文を短くして読みやすくできます。

おわりに

CASE WHEN は、SQLの中で条件分岐を行いたいときに非常に役立つ構文です。

  • 値の変換(数値→ラベルなど)
  • 条件による分類
  • 集計関数との組み合わせ

など、多くの場面で使えます。

SELECT句の中で「条件によって表示内容を変えたい」場合には、CASE WHEN を活用してみてください。

本記事が参考になれば幸いです。

Discussion