6
10
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【SQL】条件に応じたデータ処理/SQLマスターへの道「WHEN/CASE」

Last updated at Posted at 2024-07-04

導入

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文での条件分岐ロジックについて触れてみました。

ちなみに...。

条件付きソートの要件に対応する記事も書いています。
こちらもぜひ。

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10