前回ではCASE式の書き方を学びました。 ここからは、実際にどう使うのか、また「なぜWHERE句ではなくSELECTで分岐するのか」を掘り下げます。
WHEREで分ける vs SELECTで分ける
SQLの条件分岐には、2つの考え方があります。
WHERE句で行そのものを絞り込む
SELECT句(CASE)で値だけを変える
例えば「男性は‘男性’、女性は‘女性’と表示したい」というだけなら、 WHEREを使うよりもCASEの方がシンプルです。
SELECT
name,
CASE gender
WHEN 'M' THEN '男性'
WHEN 'F' THEN '女性'
ELSE '不明'
END AS 性別
FROM users;
これをもしWHEREで分けようとすると、 男性用クエリと女性用クエリを2つ書いてUNIONする必要があります。 1つのテーブルを2回読むことになり、効率も悪くなります。
SELECTのCASEを使うメリット ① 一度のアクセスで複数条件を処理できる
CASEを使えば「一つのSELECT文」で、複数の条件結果を同時に出せます。 これはパフォーマンスにも有利です。
② 結果が見やすく、メンテナンスしやすい
条件と出力結果を一か所にまとめて書けるので、あとで読んでも理解しやすいです。 WHERE句で複数クエリを分けてしまうと、「どの条件がどこにあるのか」が散らばります。
③ 集計と組み合わせやすい
CASE式はSUMやCOUNTなどの集計関数と組み合わせることで、「条件別の件数」を同時に出せます。
SELECT
SUM(CASE WHEN status = 'Shipped' THEN 1 ELSE 0 END) AS 出荷数,
SUM(CASE WHEN status = 'Cancelled' THEN 1 ELSE 0 END) AS キャンセル数
FROM orders;
これは、WHERE status = ...でそれぞれ別に集計するより効率的です。
応用例1:条件付きの計算
たとえば、地域によって割引率が異なる場合。
SELECT
region,
amount,
CASE
WHEN region = 'Tokyo' THEN amount * 0.9
WHEN region = 'Osaka' THEN amount * 0.95
ELSE amount
END AS 割引後金額
FROM sales;
1本のクエリで全地域を処理できるので、管理が簡単です。
応用例2:評価やランクの自動付与
成績表や顧客リストなど、数値から「ラベル」を付ける処理に最適です。 SQLだけで分類できるので、アプリ側で分ける必要がありません。
注意点
CASE式は条件が多くなると読みづらくなるため、必要以上にネストしないようにしましょう。
重複条件がある場合、最初に真になったWHENだけが採用される点にも注意。
大量データの場合は、複雑なCASEがパフォーマンスを落とすこともあるため、 事前にビューや中間テーブルで整理するのも手です。
まとめ(Part2のポイント)
CASE式は、WHEREよりも「柔軟で効率的」な分岐を実現できる。
集計関数との相性がよく、「分類しながら集計」が可能。
書きすぎると複雑になるので、条件の順番や重複には注意。
CASE式を使いこなせるようになると、SQLがぐっと強力になります。 単純なデータ取得だけでなく、「SQLだけで見やすいレポートを作る」ことも可能です。
引用元:
MySQL公式ドキュメント>dev.mysql.com
DigitalOcean「How To Use CASE Expressions in SQL」
W3Schools「MySQL CASE Statement」
翔泳社署 達人に学ぶsql徹底指南書 第2版 初級者で終わりたくないあなたへ
- 閲覧数 8
コメントを追加