Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

SQL CASE式の使い方|SELECT・WHERE・UPDATEで条件分岐する書き方とつまずき解消実例

20

この記事を読むとできるようになること

  • SELECT文でのCASE式の使い方が理解できる

  • WHERE句やUPDATE文でもCASEを活用できるようになる

  • NULLや型の違いでエラーが出る原因と対処法がわかる

  • 実務でよく使う集計やフラグ処理に応用できる

CASE式とは?SQLにおける条件分岐の基本

このセクションで分かること:CASE式の役割と、SQLにおける条件分岐の基本構文

SQLで「条件によって表示内容を変えたい」とき、使われるのがCASE式です。 たとえば、得点に応じて「合格/不合格」などの文字を返したい場面ですね。

SQLでは、JavaScriptやPythonのようにif文を使うのではなく、宣言的に条件を書く必要があります。 そこで登場するのが以下の2種類のCASE式です:

  • 単純CASE式(WHEN 値 THEN …)

  • 検索CASE式(WHEN 条件 THEN …)

-- 単純CASECASE score
  WHEN 100 THEN '満点'
  WHEN 80 THEN '合格'
  ELSE '不合格'
END

-- 検索CASECASE 
  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

PostgreSQL 公式ドキュメント

MySQL 8.0 リファレンスマニュアル

SQL Server の技術ドキュメント – Learn Microsoft

Oracle Database マニュアル | Oracle 日本

【内部リンク】

【SQL】副問い合わせ入門|基本構文から実例まで徹底解説

SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説

初心者向けSQL講座|SELECT文の書き方と実行順を完全解説

SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法

【図解・実践コード付き】MySQLのROW_NUMBER()完全ガイド|最新データを1件だけ抽出するROW_NUMBER()の使い方順番付けの基本と実務での活用法

【Docker入門】MySQL環境を手軽に構築する方法を徹底解説

SQL UNIONの使い方をやさしく解説|違い・注意点・活用例まとめ

もっとルートゼロを知りたいなら

DISCOVER MORE