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がどのように条件ロジックをシンプルにしてくれるか体感してみてください。