CASE式で条件分岐

CASE式で条件分岐 とは

CASE式を使ってSQLで条件分岐を実装し、柔軟なデータ処理を体験します。本レッスンでは、CASE式で条件分岐 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

業務 SQL では「ある列の値によって表示や計算を変えたい」場面が頻繁にあります。たとえば「年齢で世代を分類」「金額帯でランクを付ける」「ステータスコードを日本語に変換」「税率が複数あるとき値ごとに違う計算をする」などです。アプリケーション側で if 文を書くこともできますが、SQL の CASE 式を使えば 1 つの クエリ 内でロジックを完結できます。レポート用ビュー、ダッシュボード、データクレンジングなど活躍場面が非常に多く、SQL の真の表現力が出る構文です。

CASE の 2 つの書き方

CASE 式には 2 つの書き方があります。

SQL クエリ

-- 1. searched CASE (条件式を複数並べる) SELECT name, CASE WHEN age < 20 THEN '未成年' WHEN age < 60 THEN '現役' ELSE 'シニア' END AS generation FROM members;

SQL クエリ

-- 2. simple CASE (1 つの列を等価判定) SELECT name, CASE status WHEN 'A' THEN '在籍中' WHEN 'R' THEN '退会済み' ELSE '不明' END AS status_label FROM members;

searched CASE は条件式に何でも書けるので柔軟、simple CASE は同じ列に対する分岐を簡潔に書けます。ELSE を省略するとどの条件にも合わない行で結果が NULL になるので、デフォルト値を明示しておくのがオススメです。

評価の流れ

CASE 式は WHEN を上から順に評価し、最初にマッチした THEN の値を返します。

diagram (will load when visible)

つまり順番が重要で、たとえば WHEN age < 60WHEN age < 20 より先に書くと未成年がシニア以外の現役にまるまる吸収されてしまいます。条件の境界は注意深く順番を組みます。

代表例 1 金額帯で割引率を変える

注文金額に応じて割引率を変えるロジックです。

SQL クエリ

SELECT id, total, CASE WHEN total >= 10000 THEN total * 0.20 WHEN total >= 5000 THEN total * 0.10 WHEN total >= 3000 THEN total * 0.05 ELSE 0 END AS discount FROM orders;

大きい順から評価する書き方で、境界を明確にしています。逆順に書くと判定が崩れるので、searched CASE では金額の大きいほうから書くのが定番です。

代表例 2 集計関数と組み合わせる

CASE は集計関数の中にも入れられます。これを使うと「条件付きカウント」「条件付き合計」が 1 行で書けます。

SQL クエリ

SELECT SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count, SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count FROM members;

ピボット表 (列に項目を並べる集計) を作るときに非常によく使うパターンで、ダッシュボードでは必須テクです。

CASE は WHEN を上から評価するので、優先度の高い条件を先に書く。境界が連続するときは大きい順か小さい順のどちらかで統一しましょう。

落とし穴と注意点

CASE の各 THEN は同じ型に揃える必要があります。例えば一部の WHEN で数値を返し、他で文字列を返すとエラーになる DB が多いので、必要なら CAST で型を合わせます。

また ELSE を省略すると、想定外のデータに対して NULL が混ざります。集計やレポートで NULL が混ざるとバグの原因になりやすいので、原則 ELSE を明示する習慣を付けましょう。

実務でよく使うパターン

CASE 式はレポート系 SQL の心臓部です。マーケティング部門から「ユーザを購入金額帯別に分類した会員数を出して」と頼まれたら、CASE で帯を作って COUNT で数えれば一発です。同じく財務部門の「年度ごとの売上を象限ごとに集計」「商品カテゴリ別の在庫レベル分類」なども CASE で実装できます。アプリケーション側で実装するより SQL 側でやれば、抽出件数が大きくに小さくなりレスポンスも速くなります。

まとめ

  • searched CASE は WHEN に式を書ける柔軟なパターン
  • simple CASE は同じ列の等価判定に向いている
  • WHEN は上から順に評価。最初にマッチした THEN の値が採用される
  • ELSE を書かないと NULL が返る
  • 集計関数と組み合わせると条件付きカウント・合計やピボット集計が書ける
  • レポート・ダッシュボード系 SQL の心臓部

次のレッスン

次は DISTINCTで重複排除 です。DISTINCTを使って、SQLで重複データを取り除く方法を実践的に学習します。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. CASE 式 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. CASE 式 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

テーブル構造

schema.sql

CREATE TABLE members ( id INT PRIMARY KEY, name VARCHAR(30) NOT NULL, age INT NOT NULL ); INSERT INTO members (id, name, age) VALUES (1, '田中太郎', 15), (2, '佐藤花子', 22), (3, '鈴木一郎', 45), (4, '高橋美咲', 60), (5, '伊藤健太', 72), (6, '渡辺涼子', 30);

期待される出力

idnameagegeneration
1田中太郎15未成年
2佐藤花子22現役
3鈴木一郎45現役
4高橋美咲60シニア
5伊藤健太72シニア
6渡辺涼子30現役

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...