SQL CASE式の使い方:基礎からUPDATE文での応用まで
SQL CASE式構文:条件分岐を簡単にする強力なツール
CASE式の基本構成
CASE WHEN 条件1 THEN 結果1
WHEN 条件2 THEN 結果2
ELSE 結果3
END
- CASE: 条件分岐処理の開始
- WHEN: 条件
- THEN: 条件が真の場合に返す結果
- END: 条件分岐処理の終了
CASE式の例
- 性別に基づいて敬称を返す
SELECT CASE sex
WHEN 'M' THEN 'Mr.'
WHEN 'F' THEN 'Ms.'
ELSE 'Mx.'
END AS title
FROM users;
- 年齢に基づいて料金を割引
SELECT CASE age
WHEN 0 <= age AND age < 18 THEN price * 0.5
WHEN 18 <= age AND age < 65 THEN price
ELSE price * 0.8
END AS discounted_price
FROM customers;
- CASE式を入れ子にする
SELECT CASE status
WHEN 'Shipped' THEN '配送済み'
WHEN 'Pending' THEN
CASE delivery_method
WHEN 'Standard' THEN '配送中 (標準)'
WHEN 'Express' THEN '配送中 (速達)'
END
ELSE '注文受付中'
END AS status_description
FROM orders;
- CASE式とその他のSQL関数を組み合わせる
SELECT CASE WHEN price > 100 THEN '高額'
ELSE '低額'
END AS price_category,
UPPER(product_name) AS product_name_upper
FROM products;
CASE式のメリット
- コードの簡潔化:条件分岐処理をif文で記述するよりも簡潔に書ける
- 読みやすさの向上:条件分岐処理の流れが分かりやすく、コードの理解が容易
- 保守性の向上:コードの修正や追加が容易
- すべての条件を網羅する必要がある
- ELSE句は省略可能だが、記述することを推奨
- 複雑な条件分岐処理には不向き
CASE式を使いこなす
CASE式は、条件分岐処理を記述する強力なツールです。CASE式の基本的な構文と応用を理解し、SQLクエリを効率的に記述しましょう。
SELECT
name,
CASE sex
WHEN 'M' THEN 'Mr.'
WHEN 'F' THEN 'Ms.'
ELSE 'Mx.'
END AS title
FROM users;
出力例
| name | title |
|---|---|
| 山田太郎 | Mr. |
| 佐藤花子 | Ms. |
| 田中次郎 | Mx. |
SELECT
name,
product_name,
price,
CASE age
WHEN 0 <= age AND age < 18 THEN price * 0.5
WHEN 18 <= age AND age < 65 THEN price
ELSE price * 0.8
END AS discounted_price
FROM customers
JOIN products ON customers.product_id = products.id;
| name | product_name | price | discounted_price |
|---|---|---|---|
| 山田太郎 | ノートパソコン | 10000 | 5000 |
| 佐藤花子 | スマートフォン | 8000 | 8000 |
| 田中次郎 | テレビ | 50000 | 40000 |
SELECT
name,
order_id,
product_name,
CASE status
WHEN 'Shipped' THEN '配送済み'
WHEN 'Pending' THEN
CASE delivery_method
WHEN 'Standard' THEN '配送中 (標準)'
WHEN 'Express' THEN '配送中 (速達)'
END
ELSE '注文受付中'
END AS status_description
FROM orders
JOIN products ON orders.product_id = products.id;
| name | order_id | product_name | status_description |
|---|---|---|---|
| 山田太郎 | 12345 | ノートパソコン | 配送済み |
| 佐藤花子 | 67890 | スマートフォン | 配送中 (標準) |
| 田中次郎 | 23456 | テレビ | 注文受付中 |
SELECT
name,
product_name,
price,
CASE WHEN price > 10000 THEN '高額'
ELSE '低額'
END AS price_category,
UPPER(product_name) AS product_name_upper
FROM products;
| name | product_name | price | price_category | product_name_upper |
|---|---|---|---|---|
| 山田太郎 | ノートパソコン | 10000 | 高額 | ノートパソコン |
| 佐藤花子 | スマートフォン | 8000 | 低額 | スマートフォン |
| 田中次郎 | テレビ | 50000 | 高額 | テレビ |
SQL CASE式 以外の方法
IF関数
SELECT IF(sex = 'M', 'Mr.', 'Ms.') AS title
FROM users;
DECODE関数
SELECT DECODE(sex, 'M', 'Mr.', 'F', 'Ms.', 'Mx.') AS title
FROM users;
CASE WHEN 構文
SELECT
CASE sex
WHEN 'M' THEN 'Mr.'
WHEN 'F' THEN 'Ms.'
ELSE 'Mx.'
END AS title
FROM users;
COALESCE関数
SELECT COALESCE(NULLIF(sex, 'M'), 'Mr.') AS title
FROM users;
これらの方法は、CASE式と同様、条件に基づいて異なる結果を返すことができます。それぞれの方法にはメリットとデメリットがあり、状況に応じて使い分ける必要があります。
- 読みやすい
- 書きやすい
- 保守しやすい
- すべてのデータベースでサポートされているわけではない
IF関数のメリット
- シンプル
- 読みづらい
- 書きづらい
- CASE式よりも簡潔に書ける
- CASE式よりも読みづらい
- NULL値を処理できる
どの方法を使うべきかは、状況によって異なります。以下のような点を考慮する必要があります。
- 条件分岐処理の複雑さ
- 保守性
- 使用しているデータベース
複雑な条件分岐処理の場合は、CASE式よりもIF関数やDECODE関数を使う方が良い場合があります。
読みやすさを重視する場合は、CASE WHEN 構文を使う方が良い場合があります。
使用しているデータベースによっては、すべての方法がサポートされているわけではありません。
sql