🤖 CASE文(ケース・ステートメント)
今回は、SQLクエリの結果を動的に、そして論理的に操作するための秘密兵器、「CASE文」を紹介します。CASE文は、ExcelのIF関数や、プログラミングのif/else文と全く同じように機能します。
これにより、「もしAという条件を満たしたらBと表示し、そうでなければCと表示する」という処理が、SQL上で可能になります!
🧐 第1章:CASE文の基本構文(IF-THEN-ELSE)
CASE文は、SELECT句で新しい列を作成する際によく使われます。
1-1. 基本形
【例題】商品のリスト価格による分類
リスト価格が100ドル超なら「高額製品」、それ以下なら「安価製品」と分類します。
SELECT
ListPrice,
CASE
WHEN ListPrice > 100 THEN '高額製品'
ELSE '安価製品' -- 上のWHENに該当しなかった全ての行に適用
END AS ProductPriceClass
FROM
Production.Product
WHERE
ListPrice <> 0;
🎯 第2章:CASE文の応用(複数条件とデータ変換)
2-1. 複数条件による「範囲」でのグルーピング
CASE文の真骨頂は、複数のWHEN句を使って、データを特定のカテゴリや範囲に分類することです。
【例題】年齢による顧客のレンジ分類
年齢を計算した後、その値によって「18歳未満」「18〜24歳」などのレンジに分類します。
SELECT
Age,
CASE
WHEN Age IS NULL THEN '年齢不明' -- 💡 NULL値の処理
WHEN Age BETWEEN 0 AND 17 THEN '18歳未満'
WHEN Age BETWEEN 18 AND 24 THEN '18-24歳'
WHEN Age BETWEEN 25 AND 34 THEN '25-34歳'
-- ...
ELSE '65歳以上' -- どの条件にも合わない場合の最終処理
END AS AgeRange
FROM
CustomerAges -- 年齢が計算されたCTE
2-2. コード値の変換(データ品質の向上)
データベースに「M」「F」といったコードで保存されている値を、「Male」「Female」といった正式名称に変換して表示するのにも使われます。
【例題】性別コードを正式名称に変換
SELECT
FirstName,
CASE
WHEN Gender = 'M' THEN '男性 (Male)'
WHEN Gender = 'F' THEN '女性 (Female)'
ELSE '性別未指定' -- M/F以外(NULLも含む)の全てのコードを処理
END AS GenderValue
FROM
EmployeeDemographics;
💡 COALESCE関数との比較:
COALESCEは「NULLだったらこれ」という特定の処理に特化していますが、CASE文は「もしこういう条件だったらこう」というより複雑な論理を記述できます。NULL処理もCASE文で代替可能です。(例: WHEN MiddleName IS NULL THEN '')
📊 第3章:CASE文と集計・並び替え(最強コンボ)
CASE文で作った新しい分類列は、GROUP BY句やORDER BY句でそのまま利用できるため、集計や並び替えで非常に強力な力を発揮します。
3-1. 作成したレンジでのグループ集計
前章で作ったAgeRange列は、そのままGROUP BY句で使って、各レンジの人数を数えることができます。
SELECT
AgeRange,
COUNT(*) AS CustomerCount
FROM
CustomerAgeRanges -- AgeRange列を持つCTE
GROUP BY
AgeRange
ORDER BY
CustomerCount DESC;
3-2. 🚨 魔法の並び替え(ORDER BY CASE) 🚨
文字列として分類されたレンジ(例: " under 150", "150-499")は、そのまま並び替えると辞書順(アルファベット順) になり、意図しない順番になります。
これを解決するのが、ORDER BY句内でCASE文を使うテクニックです。
SELECT
SalesRange,
COUNT(*) AS CustomersInRange
FROM
... -- (SalesRangeが定義されたCTE)
GROUP BY
SalesRange
ORDER BY
CASE
WHEN SalesRange = 'under 150' THEN 1 -- 💡 これを1番目にする
WHEN SalesRange = '150 to 499.99' THEN 2 -- 💡 これを2番目にする
WHEN SalesRange = '500 to 4999.99' THEN 3 -- 💡 これを3番目にする
-- ...
ELSE 99 -- その他の場合は最後に
END;
👉 仕組み: SQLは、まずこのCASE文を実行し、各行に隠された数字(1, 2, 3...) を割り当てます。そして、その数字(1, 2, 3...)を使って並び替えを行うため、文字列でありながら意図した順番で表示されるのです!これは、実務で非常に役立つテクニックです!
CASE文をマスターすれば、あなたのSQLクエリの表現力は格段に向上します。
