SQL Serverを使ったデータ分析やレポート作成の際、条件に応じて値を振り分けたい場面がよくあります。そんなときに役立つのがCASEステートメントです。
本記事では、初心者の方でもわかりやすいように、CASEステートメントの基本構文から具体例、注意点までを解説します。最後には演習問題と解答例も用意していますので、ぜひ手を動かして理解を深めてください。
CASEステートメントとは
CASEステートメントは、SQLのSELECT句やWHERE句、ORDER BY句などで使える条件分岐の機能です。
プログラミング言語におけるif~elseに相当し、指定した条件にマッチしたときに特定の値を返します。SQL Serverでは大きく分けて以下の2種類があります。
- シンプルCASE:評価対象の列や式が固定され、WHEN句で値を比較する
- 検索CASE:WHEN句ごとに異なる条件式を評価する
基本構文
シンプルCASE
CASE <評価対象>
WHEN <値1> THEN <結果1>
WHEN <値2> THEN <結果2>
…
ELSE <その他の結果>
END
- <評価対象>:比較したい列名や式
- WHEN <値>:評価対象と比較する値
- THEN <結果>:比較が一致したときに返す値
- ELSE:どのWHENにも当てはまらない場合の値(省略可)
検索CASE
各WHEN句に自由な条件式を記述でき、複雑なロジックを実装する際に便利です。
CASE
WHEN <条件式1> THEN <結果1>
WHEN <条件式2> THEN <結果2>
…
ELSE <その他の結果>
END
シンプルCASEの具体例
テーブル Products の CategoryID 列に応じてカテゴリ名を表示する例です。
SELECT
ProductID,
ProductName,
CategoryID,
CASE CategoryID
WHEN 1 THEN '食品'
WHEN 2 THEN '飲料'
WHEN 3 THEN '文房具'
ELSE 'その他'
END AS CategoryName
FROM Products;
- CategoryIDが1なら「食品」、2なら「飲料」、3なら「文房具」、それ以外は「その他」と表示
- 単純なマッピングに最適
検索CASEの具体例
売上テーブル Sales の金額 Amount に応じて売上ランクを振り分ける例です。
SELECT
SaleID,
Amount,
CASE
WHEN Amount >= 100000 THEN 'Aランク'
WHEN Amount >= 50000 THEN 'Bランク'
WHEN Amount >= 10000 THEN 'Cランク'
ELSE 'Dランク'
END AS SalesRank
FROM Sales;
- 金額が10万円以上→A、5万円以上→B、1万円以上→C、それ未満→D
- 範囲指定が必要な場合はこちらを使用
実践例:月別売上の評価
テーブル MonthlySales の月別売上に対して「良」「普通」「要改善」のラベルを付与します。
SELECT
Month,
SalesAmount,
CASE
WHEN SalesAmount >= 200000 THEN '良'
WHEN SalesAmount >= 100000 THEN '普通'
ELSE '要改善'
END AS Performance
FROM MonthlySales
ORDER BY Month;
- 売上20万円以上→「良」、10~20万円→「普通」、それ未満→「要改善」
- ORDER BYで月順にソート
CASEステートメントの活用ポイント
- NULL処理
WHEN句でNULLを扱う場合は WHEN <列> IS NULL THEN … のように検索CASEを使う - パフォーマンス
大量データを扱う場合、複雑なCASEはクエリプランに影響することがあるためインデックス設計を確認 - ネスト
CASEの中にさらにCASEを入れることも可能。ただし可読性が低下するため注意
まとめ
- CASEステートメントはSQLの条件分岐機能
- シンプルCASEは固定値の比較、検索CASEは条件式による評価
- SELECT句だけでなく、WHERE句やORDER BY句でも使用可能
- NULLやパフォーマンスに注意しつつ、適切に使い分けよう
演習問題
以下のテーブル Employees を想定して演習します。
EmployeeID | Name | DepartmentID | Salary |
---|---|---|---|
1 | 佐藤 | 10 | 300000 |
2 | 鈴木 | 20 | 450000 |
3 | 高橋 | 10 | 150000 |
4 | 田中 | 30 | 80000 |
5 | 伊藤 | NULL | 120000 |
問1
DepartmentID に応じて以下のように表示するクエリを作成してください。
- 10 → ‘営業部’
- 20 → ‘開発部’
- 30 → ‘総務部’
- NULL → ‘未所属’
- その他 → ‘その他部門’
問2
Salary によって以下の給与ランクを返す検索CASEのクエリを作成してください。
- 400,000以上 → ‘高給’
- 200,000以上 → ‘中給’
- 100,000以上 → ‘低給’
- それ未満 → ‘極低給’
問3
問1と問2を組み合わせ、以下の列を取得するクエリを作成してください。
- EmployeeID
- Name
- 部署名(問1の結果)
- 給与ランク(問2の結果)
解答例
解答1(シンプルCASE+NULL対応)
SELECT
EmployeeID,
Name,
CASE DepartmentID
WHEN 10 THEN '営業部'
WHEN 20 THEN '開発部'
WHEN 30 THEN '総務部'
WHEN NULL THEN '未所属' -- ※シンプルCASEではNULLはヒットしないため注意
ELSE 'その他部門'
END AS DepartmentName
FROM Employees;
SQL ServerではシンプルCASEのWHEN NULLはマッチしないため、実際は検索CASEで書くのが正解です。
-- 検索CASEを使った正解例
SELECT
EmployeeID,
Name,
CASE
WHEN DepartmentID = 10 THEN '営業部'
WHEN DepartmentID = 20 THEN '開発部'
WHEN DepartmentID = 30 THEN '総務部'
WHEN DepartmentID IS NULL THEN '未所属'
ELSE 'その他部門'
END AS DepartmentName
FROM Employees;
解答2(検索CASE)
SELECT
EmployeeID,
Name,
Salary,
CASE
WHEN Salary >= 400000 THEN '高給'
WHEN Salary >= 200000 THEN '中給'
WHEN Salary >= 100000 THEN '低給'
ELSE '極低給'
END AS SalaryRank
FROM Employees;
解答3(組み合わせ)
SELECT
EmployeeID,
Name,
CASE
WHEN DepartmentID = 10 THEN '営業部'
WHEN DepartmentID = 20 THEN '開発部'
WHEN DepartmentID = 30 THEN '総務部'
WHEN DepartmentID IS NULL THEN '未所属'
ELSE 'その他部門'
END AS DepartmentName,
CASE
WHEN Salary >= 400000 THEN '高給'
WHEN Salary >= 200000 THEN '中給'
WHEN Salary >= 100000 THEN '低給'
ELSE '極低給'
END AS SalaryRank
FROM Employees;
以上で、SQL ServerのCASEステートメントの基礎から演習問題までを解説しました。
実際に手を動かしてクエリを実行し、結果を確認することで理解が深まります。ぜひチャレンジしてみてください!