この記事を読むとできるようになること
-
SELECT文でのCASE式の使い方が理解できる
-
WHERE句やUPDATE文でもCASEを活用できるようになる
-
NULLや型の違いでエラーが出る原因と対処法がわかる
-
実務でよく使う集計やフラグ処理に応用できる
CASE式とは?SQLにおける条件分岐の基本
このセクションで分かること:CASE式の役割と、SQLにおける条件分岐の基本構文
SQLで「条件によって表示内容を変えたい」とき、使われるのがCASE式です。 たとえば、得点に応じて「合格/不合格」などの文字を返したい場面ですね。
SQLでは、JavaScriptやPythonのようにif文を使うのではなく、宣言的に条件を書く必要があります。 そこで登場するのが以下の2種類のCASE式です:
-
単純CASE式(WHEN 値 THEN …)
-
検索CASE式(WHEN 条件 THEN …)
-- 単純CASE式
CASE score
WHEN 100 THEN '満点'
WHEN 80 THEN '合格'
ELSE '不合格'
END
-- 検索CASE式
CASE
WHEN score >= 80 THEN '合格'
WHEN score >= 50 THEN '再試験'
ELSE '不合格'
END
SELECT句で使うCASE:基本の書き方と例
このセクションで分かること:SELECT文で値を条件によって分けて表示する基本パターンと実務例
実例①:点数によって評価を出し分ける
SELECT
name,
score,
CASE
WHEN score >= 80 THEN '優秀'
WHEN score >= 60 THEN '合格'
ELSE '不合格'
END AS 評価
FROM students;
出力結果(例):
| name | score | 評価 |
|------|-------|--------|
| A | 85 | 優秀 |
| B | 65 | 合格 |
| C | 40 | 不合格 |
実例②:NULLを「未入力」に変換
SELECT
user_name,
CASE
WHEN email IS NULL THEN '未入力'
ELSE email
END AS メールアドレス
FROM users;
WHERE句でのCASE使用:可能だが注意が必要
このセクションで分かること:WHERE句内でのCASE使用は可能だが、可読性と実装リスクを理解しよう
実例③:検索条件を動的に切り替える
SELECT * FROM users
WHERE
1 = CASE
WHEN :param = 1 THEN is_active
WHEN :param = 2 THEN NOT is_active
END;
注意点と代替案
-
CASE式は戻り値を返すもので、WHERE条件そのものを切り替えると読みにくくなる
-
複雑な条件はUNIONでクエリを分ける、またはビューに切り出すのも有効
GROUP BYや集計とCASEの組み合わせ
このセクションで分かること:条件によって集計グループやフラグを変えるパターン
実例④:売上ランクをCASEで分類する
SELECT
store_id,
CASE
WHEN SUM(sales) >= 100000 THEN 'Aランク'
WHEN SUM(sales) >= 50000 THEN 'Bランク'
ELSE 'Cランク'
END AS 売上ランク
FROM sales
GROUP BY store_id;
実例⑤:条件を満たす件数のみをカウント
SELECT
COUNT(CASE WHEN status = '完了' THEN 1 END) AS 完了件数,
COUNT(CASE WHEN status = '未完了' THEN 1 END) AS 未完了件数
FROM tasks;
UPDATE文でCASEを使って一括条件更新
このセクションで分かること:条件によって更新値を変えるUPDATE構文と注意点
実例⑥:利用日数によって会員ランクを更新する
UPDATE users
SET rank = CASE
WHEN usage_days >= 365 THEN 'ゴールド'
WHEN usage_days >= 180 THEN 'シルバー'
ELSE 'ブロンズ'
END;
よくあるつまずき・エラーと解決策
このセクションで分かること:CASEでハマりやすいエラーとその回避方法
-
つまずき例:NULLとの比較がうまくいかない
原因:= NULL は評価されない
解決策:IS NULL や COALESCE を使う -
つまずき例:数値と文字列が混ざっている
原因:データ型の不一致
解決策:CASTまたは統一した型を使う -
つまずき例:ELSE を書き忘れて NULL になる
原因:マッチしない条件が存在する
解決策:ELSE 句を必ず書く -
つまずき例:ネストが深くなって読めない
原因:複雑なロジックをCASEに詰めすぎ
解決策:条件式を整理し、ビュー化も検討
IF / DECODEとの違い
-
IFはMySQL特有で関数形式
-
DECODEはOracleでシンプルだが表現力に限界
-
CASEは標準SQLで移植性が高い
UIとSQLの役割分担
-
表示用の分岐はUIに任せる方が良いことも
-
集計や変換はSQL側で済ませる方が効率的な場合も多い
まとめ
CASEは強力な条件分岐ツールだが、SELECT / WHERE / UPDATEに応じた使い方と構文理解が必要。この記事を通して、使いどころや書き方のパターンが明確になったはずです。
【外部リンク】
SQL MDN: Mastery, Discovery, Nuances – SQL Habit
SQL Server の技術ドキュメント – Learn Microsoft
Oracle Database マニュアル | Oracle 日本
【内部リンク】
SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説
初心者向けSQL講座|SELECT文の書き方と実行順を完全解説
SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法
【図解・実践コード付き】MySQLのROW_NUMBER()完全ガイド|最新データを1件だけ抽出するROW_NUMBER()の使い方順番付けの基本と実務での活用法