【SQL】CASE WHEN の基本構文と使い方を解説
はじめに
SQLでは、条件に応じて異なる値を返したい場面がよくあります。
例えば、
- 数値に応じて「評価」を表示したい
- フラグに応じて「ステータス名」を切り替えたい
そんなときに便利なのが CASE WHEN
です。
本記事では、CASE WHEN
の基本構文と使いどころ、注意点について解説します。
1. 基本構文
CASE WHEN
は、条件ごとに値を分岐させることができる構文です。
SELECT
カラム名,
CASE
WHEN 条件1 THEN 値1
WHEN 条件2 THEN 値2
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 WHEN
は COUNT
, 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 WHEN
は SELECT
句だけでなく、ORDER BY
や WHERE
、HAVING
句などでも使えます。
たとえば、「スコアが存在する学生だけを対象に、スコアが一定以上かどうかでフィルターしたい」といった条件を 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個の場合は、次のように AND
や OR
で書いた方がわかりやすいかもしれません。
-- 実際にはこちらの方が読みやすく、パフォーマンスも良い
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