導入
SQL文で複雑な条件に対応できる式、WHEN/CASE
を紹介します。
- データの属性に応じて異なる処理を行いたい時
- 条件に依って、ソートキーを変えたい時
と、SQLクエリへの柔軟性を向上させることができます。
WHEN/CASEの基本
CASE式は、分岐ロジックを提供してくれます。
具体例を見たほうが早いと思いますので、ぜひご覧ください。
実践① ~ 得点に応じてラベルの割当
テストで90点Overの人は「Excellent」、60点以下の人は「赤点だよ」のラベル表示をしてみます。
(高専の赤点は60点でした。)
サンプルデータ
student_id | name | score |
---|---|---|
1 | Alice | 88 |
2 | Bob | 92 |
3 | Carol | 67 |
4 | Dave | 85 |
5 | Eve | 58 |
SQL文
SELECT student_id, name, score,
CASE
WHEN score >= 90 THEN 'Excellent'
WHEN score >= 80 THEN 'Good'
WHEN score >= 60 THEN 'Average'
ELSE '赤点だよ'
END AS performance
FROM Students;
結果
student_id | name | score | performance |
---|---|---|---|
1 | Alice | 88 | Good |
2 | Bob | 92 | Excellent |
3 | Carol | 67 | Average |
4 | Dave | 85 | Good |
5 | Eve | 58 | 赤点だよ |
解説
なんとなくイメージはつきましたか?
スコア値に応じて、ラベル名の表示を変更する分岐ロジックを実装してみました。
実践② ~ 従業員の区分に応じて給与計算
従業員テーブルから区分に応じて、給与の増減を計算してみます。
管理職は給与を10%増、一般職はそのまま、インターンは20%減で処理を行います。
サンプルデータ
employee_id | name | position | salary |
---|---|---|---|
1 | Alice | Manager | 5000 |
2 | Bob | Staff | 3000 |
3 | Carol | Intern | 2000 |
4 | Dave | Staff | 3200 |
5 | Eve | Manager | 5500 |
SQL文
SELECT name, position, salary,
CASE
WHEN position = 'Manager' THEN salary * 1.10
WHEN position = 'Staff' THEN salary
WHEN position = 'Intern' THEN salary * 0.80
ELSE salary
END AS adjusted_salary
FROM Employees;
結果
name | position | salary | adjusted_salary |
---|---|---|---|
Alice | Manager | 5000 | 5500 |
Bob | Staff | 3000 | 3000 |
Carol | Intern | 2000 | 1600 |
Dave | Staff | 3200 | 3200 |
Eve | Manager | 5500 | 6050 |
解説
いかがですか?データの属性に応じて柔軟に処理を変えることができます。
実践③ ~ 在庫管理システムログの入力
INSERT文でもやってみましょう。
締め作業で、製品の在庫状況をログに入力するタスクがあると想定してください。
商品数の在庫数に応じて、「適切」or「在庫不足」の入力をしてみましょう。
サンプルデータ
製品テーブル
product_id | name | quantity |
---|---|---|
101 | 製品 A | 75 |
102 | 製品 B | 40 |
103 | 製品 C | 55 |
ログテーブル(入力用)
log_id | product_id | log_description |
---|
SQL
INSERT INTO ProductLogs (product_id, log_description)
SELECT product_id,
CASE
WHEN quantity > 50 THEN '適切'
ELSE '在庫不足'
END
FROM Products
WHERE product_id IN (101, 102, 103);
結果
log_id | product_id | log_description |
---|---|---|
1 | 101 | 適切 |
2 | 102 | 在庫不足 |
3 | 103 | 適切 |
まとめ
今回は、WHEN
/CASE
を使ってSQL文での条件分岐ロジックについて触れてみました。
ちなみに...。
条件付きソートの要件に対応する記事も書いています。
こちらもぜひ。