本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第6章 式と関数で加工する · レッスン24

CASE式 ― 条件で値を振り分ける

ブラウザで完結

導入

「在庫が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;

CASEEND までで1つの式(=1つの列)になります。END の後ろに AS 別名 を付けるのを忘れずに。ELSE を省くと、どの条件にも合わない行はその列が NULL になります。

CASE は集計とも相性が良く、「条件に合う件数だけ数える」といった使い方もできます(SUM(CASE WHEN 条件 THEN 1 ELSE 0 END))。まずは「値を振り分ける」基本をつかみましょう。

やってみよう

初期表示のクエリを実行し、各商品に在庫ラベルが付くことを確認しましょう。Webカメラ(在庫0)が「在庫切れ」、モニター(15)が「残りわずか」になるはずです。しきい値 3050 に変えて、ラベルの付き方が変わることも見てください。

演習

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;

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。