SQL CASE文:クエリに条件分岐ロジックを追加する
Published: 2026-02-11
CASE文は、クエリに条件分岐ロジックを追加するためのSQLの仕組みです。if-then-else文のように動作し、条件に応じて異なる値を返すことができます。CASEはSQLite、PostgreSQL、MySQL、SQL Server、Oracleなど、主要なSQLデータベースすべてでサポートされています。
サンプルデータ
すべての例で次の2つのテーブルを使用します。
products テーブル:
| id | name | category | price | stock | rating |
|---|---|---|---|---|---|
| 1 | Laptop Pro | Electronics | 1299.99 | 15 | 4.5 |
| 2 | Wireless Mouse | Electronics | 29.99 | 50 | 4.2 |
| 3 | Office Chair | Furniture | 249.99 | 8 | 4.7 |
| 4 | Desk Lamp | Furniture | 39.99 | 25 | 3.9 |
| 5 | Notebook Pack | Stationery | 12.99 | 100 | 4.0 |
| 6 | Pen Set | Stationery | 8.99 | 75 | 3.5 |
| 7 | Monitor 27" | Electronics | 399.99 | 0 | 4.6 |
| 8 | Standing Desk | Furniture | 599.99 | 3 | 4.8 |
orders テーブル:
| id | product_id | quantity | order_date | status |
|---|---|---|---|---|
| 1 | 1 | 2 | 2026-02-01 | delivered |
| 2 | 2 | 5 | 2026-02-03 | shipped |
| 3 | 3 | 1 | 2026-02-05 | processing |
| 4 | 4 | 3 | 2026-02-06 | delivered |
| 5 | 5 | 10 | 2026-02-07 | shipped |
| 6 | 1 | 1 | 2026-02-08 | cancelled |
| 7 | 7 | 1 | 2026-02-09 | pending |
| 8 | 8 | 1 | 2026-02-10 | processing |
シンプルCASE式
シンプルCASE式は、ある列または式を特定の値と比較します。等価比較を行う場合に簡潔に書けます。
構文
CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
例: 注文ステータスの分類
注文ステータスコードを、ユーザーにわかりやすいラベルに変換します。
検索CASE式
検索CASE式は、真偽値を返す条件式を評価し、複雑な比較や範囲指定を可能にします。
構文
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
例: 価格カテゴリ
価格帯ごとに商品を分類します。
例: 在庫状況ステータス
しきい値に応じて在庫状況を判定します。
計算の中でCASEを使う
CASE文は、計算結果を条件付きで変更したり、条件付きの数式を適用したり、NULL値を扱ったりするために使えます。
例: カテゴリ別割引の適用
商品カテゴリに応じて割引価格を計算します。
例: 金額とステータスによる注文優先度
複数の要素に基づいて注文の優先度を計算します。
集約関数の中でのCASE
集約関数の中でCASEを使うと、ピボットテーブルのようなレポートや条件付きカウントを作成できます。
例: 在庫状況別の商品数
在庫カテゴリごとに、いくつの商品があるかを数えます。
例: カテゴリ別・ステータス別売上
条件付き集約を使って、さまざまな指標を計算します。
ORDER BYでのCASE
ORDER BY句の中でCASEを使うと、カスタムのソートロジックを作成できます。
例: カスタムソート順
在庫切れの商品を先頭にし、その後は評価順で並べ替えます。
ネストしたCASE文
より複雑なロジックのために、CASE式を入れ子にすることができます。
例: 複雑な商品分類
複数の条件を組み合わせて、詳細なカテゴリ分けを行います。
CASE文の主な用途
- データのカテゴリ分け — 値を範囲やカテゴリにグループ化する
- 条件付きフォーマット — ユーザーにわかりやすいラベルやステータス表示に変換する
- 動的な計算 — 条件に応じて異なる数式を適用する
- ピボットテーブルの作成 — 集約と組み合わせてクロスタブレポートを作る
- カスタムソート — ビジネスロジックに合わせた特定の並べ替え順を定義する
- NULL値の扱い — 欠損データを置き換えたりフラグを立てたりする
- 複数条件による判定 — 複雑なビジネスルールをSQLで実装する
CASE vs. IIF と COALESCE
- CASE — 最も柔軟で、複数の条件を扱える
- IIF(condition, true_value, false_value) — 単一条件向けの簡潔な構文(SQL Server、Access)
- COALESCE(val1, val2, …) — 最初の非NULL値を返す(NULL処理に便利)
SQLiteはCASEとCOALESCEの両方をサポートしますが、IIFはサポートしません。最大限の互換性を得るにはCASEを使いましょう。
パフォーマンス上のヒント
- 条件の順序を工夫する — 発生頻度の高い条件を先に書く
- 不要な評価を避ける — CASEは上から順に評価し、最初に一致した時点で処理を止める
- 適切な列にインデックスを張る — CASEで列比較を行う場合、インデックスが役立つことがある
- 計算列の利用を検討する — よく使うCASEロジックについては、インデックス付き計算列をサポートするDBもある
まとめ
CASEは、if-then-elseのような条件分岐ロジックをSQLクエリに追加する- シンプルCASEは、列を特定の値と比較する:
CASE column WHEN value THEN result - 検索CASEは、真偽条件を評価する:
CASE WHEN condition THEN result - SELECT、WHERE、ORDER BY、集約関数の中で利用できる
- CASE式はネストして、複雑な意思決定ツリーを表現できる
- 想定外の値に対応するため、常にELSE句を含めるのが望ましい
- 主要なSQLデータベースすべてで、ほぼ同じ構文でサポートされている
ここで紹介した例を変更しながら、さまざまな条件を試してみて、CASEがどのように条件ロジックをシンプルにしてくれるか体感してみてください。