12. MS SQL CASE文

 


🤖 CASE文(ケース・ステートメント)

今回は、SQLクエリの結果を動的に、そして論理的に操作するための秘密兵器、「CASE文」を紹介します。CASE文は、ExcelのIF関数や、プログラミングのif/else文と全く同じように機能します。

これにより、「もしAという条件を満たしたらBと表示し、そうでなければCと表示する」という処理が、SQL上で可能になります!


🧐 第1章:CASE文の基本構文(IF-THEN-ELSE)

CASE文は、SELECT句で新しい列を作成する際によく使われます。

1-1. 基本形

構文要素役割
CASECASE文の開始宣言
WHEN [条件]「もし、この条件が(True)だったら…」
THEN [結果]「…この値を返す」
ELSE [結果]全ての条件に合わなかったら、この値を返す」(省略可能だが推奨)
ENDCASE文の終了宣言(必須!

【例題】商品のリスト価格による分類

リスト価格が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クエリの表現力は格段に向上します。