CASE式の実践と応用:WHERE句で分岐せずSELECTで分ける理由

  •  
 
suu に投稿

前回では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版 初級者で終わりたくないあなたへ

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。