導入
「在庫が0なら『在庫切れ』、30未満なら『残りわずか』、それ以外は『十分』と表示したい」。プログラミングの if / else if / else にあたる分岐を、SQL の中でやりたくなることがあります。これを担うのが CASE式 です。値を条件で別の値に振り分けて取り出せます。
説明
CASE は「上から順に WHEN 条件 THEN 値 を試し、最初に真になったものの値を返す。どれも当てはまらなければ ELSE の値」という動きです。
flowchart TB
S["stock の値"] --> W1{"stock = 0 ?"}
W1 -->|"はい"| R1["'在庫切れ'"]
W1 -->|"いいえ"| W2{"stock < 30 ?"}
W2 -->|"はい"| R2["'残りわずか'"]
W2 -->|"いいえ"| R3["ELSE → '十分'"]
SELECT name, stock,
CASE
WHEN stock = 0 THEN '在庫切れ'
WHEN stock < 30 THEN '残りわずか'
ELSE '十分'
END AS stock_label
FROM products;
CASE 〜 END までで1つの式(=1つの列)になります。END の後ろに AS 別名 を付けるのを忘れずに。ELSE を省くと、どの条件にも合わない行はその列が NULL になります。
CASE は集計とも相性が良く、「条件に合う件数だけ数える」といった使い方もできます(SUM(CASE WHEN 条件 THEN 1 ELSE 0 END))。まずは「値を振り分ける」基本をつかみましょう。
やってみよう
初期表示のクエリを実行し、各商品に在庫ラベルが付くことを確認しましょう。Webカメラ(在庫0)が「在庫切れ」、モニター(15)が「残りわずか」になるはずです。しきい値 30 を 50 に変えて、ラベルの付き方が変わることも見てください。
演習
users から、名前 name と年齢 age に加えて、age が 30 以上なら '30代以上'、そうでなければ '20代' を返す列を generation という別名で取り出してください。
ヒント1を見る
CASE WHEN age >= 30 THEN '30代以上' ELSE '20代' END AS generation
ヒント2を見る
SELECT name, age, CASE WHEN age >= 30 THEN '30代以上' ELSE '20代' END AS generation FROM users;