「SQLでSelectするときに、条件によって取得するものを変えたい」
そんなときにはCASE式を使用しましょう。
本記事を読むと条件分岐の基本や、null判定、文字列判定をするSQLコードが書けるようになります。
ぜひご一読ください。
基本的なCASE式の書き方
CASE式は条件に一致する場合の出力をCASE WHEN XXXX THEN ~に、一致しない場合の条件を ELSE ~ の形式で記載します。
下記のような書き方になります。
SELECT CASE WHEN XXXX
THEN [XXXXに該当する場合]
ELSE [XXXXに該当しない場合]
END
FROM テーブル
CASE式 複数条件の書き方
複数条件を指定したいときは、条件の数だけWHENを記載すればOKです。
<サンプルテーブル>
「zaiko」という名称のサンプルテーブルを使い解説します。
テーブル構造と内容は下記の通りです。
| ID | 製品 | 適正在庫 | 数量 |
| 1 | 冷蔵庫 | 50 | 60 |
| 2 | テレビ | 20 | 0 |
| 3 | エアコン | 20 | 10 |
<SQL文>

<出力>
| ID | 製品 | 在庫状況 |
| 1 | 冷蔵庫 | 在庫は十分です |
| 2 | テレビ | 在庫切れです |
| 3 | エアコン | 在庫が不足しています |
CASE式 入れ子構造の書き方
CASE式の中にCASE式を記載する入れ子構造を使うと、複雑な条件分岐を実現できます。
入れ子を使うとSQL文量が少なくなり、メンテナンスがしやすくなり読み易くなるメリットがあります。
各CASE式と対応するELSEやENDを間違えないように注意してください。
(下記サンプルではCASE式と対応するELSE,ENDを色分けしています)
SELECT CASE WHEN XXXX
THEN [XXXXに該当する場合]
ELSE
CASE WHEN YYYY
THEN [XXXXに該当せずYYYYに該当する場合]
ELSE
[XXXXにもYYYYにも該当しない場合]
END
END
FROM テーブル
色々なCASE式 応用例
ここまではCASE式の基本的な書き方や入れ子構造について解説しました。
ここからはもう少々実践的に、CASE式の応用例について記載します。
順に簡単な説明とサンプルSQLを記載していきますので、ご自身でも実際に打ち込んで使用してみてください。
条件をAND/ORでつなぐ
CASE式の条件文にANDやORといった論理演算子を使用できます。
ANDの場合は結合された条件をすべて満たす場合、ORの場合はいずれかの条件を満たす場合に条件文を通ります。
SELECT ID, 製品,
CASE WHEN 適正在庫 <> 0 AND 数量 < 適正在庫 THEN ‘在庫の補充が必要’
ELSE ‘在庫は足りています’
FROM zaiko;
CASE式でnull判定
nullかどうかで条件分岐をする場合は、「is null」や「is not null」と書きます。
select ID,
CASE WHEN 製品 is null THEN ‘該当製品なし’,
ELSE 製品
from zaiko;
likeで特定の文字を含むか判定
CASE式とlikeを組み合わせ、特定の文字列を含むかで条件分岐ができます。
「%」はワイルドカードの働きをします。
前方一致、後方一致、部分一致を判定するには「%」を使いましょう。
SELECT CASE WHEN 製品 like ‘テレビ’ THEN … –「テレビ」と完全一致
WHEN 製品 like ‘冷蔵庫%‘ THEN … –「冷蔵庫」で始まる場合
WHEN 製品 like’%エアコン’ THEN … –「エアコン」で終わる場合
WHEN 製品 like’%こたつ%‘ THEN … –「こたつ」を含む場合
ELSE
END
order byにCASE式を使って出力をソート
order byの中でもCASE式を使用することができます。
select結果をソートしたいけど、テーブルに使いたいソートキーがない場合に有効です。
SELECT * FROM zaiko
ORDER BY
CASE WHEN 製品 = ‘エアコン’ THEN 1
WHEN 製品 = ‘テレビ’ THEN 2
WHEN 製品 = ‘冷蔵庫’ THEN 3
ELSE 0
END;
CASE式は応用幅が広く、SQLエンジニアなら確実におさえておきたい構文です。
ぜひ自分でもいろいろなCASE式を書いて実行し、CASE式を使いこなしてください!
