SQLのcase whenについてまとめています。
SQL case whenの構文

mysql>SELECT *
FROM employees
WHERE (
CASE
WHEN first_name='Georgi'
AND last_name='Facello' THEN 'CHECK'
END) = 'CHECK';
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 55649 | 1956-01-23 | Georgi | Facello | M | 1988-05-04 |
+--------+------------+------------+-----------+--------+------------+
2 rows in set (0.12 sec)
case when~という記述方法は、case式の記述方法の一種で「検索case式」と呼ばれるものです。
上記の例では、やや回りくどいのですが、first_name=Georgi、last_name=Facelloのデータの場合に’CHECK’=’CHECK’が真となりselectの抽出対象となるように記述しています。
【関連記事】
▶SQLのcaseはクエリ内に条件分岐を組み込む 単純case式、検索case式あり
SQLのcase when(検索case式)の使い方

単純case式と比べると、検索式の記述方法は、より複雑な条件を組み込むことが可能です。
SELECT employees.first_name,
employees.last_name,
CASE
WHEN dept_emp.from_date < '1999-01-01'
AND dept_emp.to_date = '9999-01-01' THEN 'employment'
WHEN dept_emp.to_date != '9999-01-01' THEN dept_emp.to_date
ELSE 'employement'
end AS zaishoku
FROM dept_emp,
employees
WHERE employees.emp_no > 10100
AND dept_emp.emp_no = employees.emp_no
LIMIT 10;
+------------+------------+-------------+
| first_name | last_name | zaishoku |
+------------+------------+-------------+
| Perla | Heyers | 2000-09-23 |
| Paraskevi | Luby | employment |
| Akemi | Birch | employment |
| Xinyu | Warwick | employment |
| Hironoby | Piveteau | 2001-06-11 |
| Eben | Aingworth | employment |
| Dung | Baca | employement |
| Lunjin | Giveon | 2001-10-20 |
| Lunjin | Giveon | 1999-12-06 |
| Mariusz | Prampolini | employment |
+------------+------------+-------------+
10 rows in set (0.11 sec)
【関連記事】
▶SQLのwhereはcase式で条件切替が可能 条件の有り・無しを記述できる
なお、case式はselect文のカラムだけではなく、where内でも使用可能です。以下のSQLは、emp_no(社員番号)が10010以下の場合はfirst_nameがSで始まるデータを、それ以外はすべて(case式の値
1で、常に真)のデータを出力します。
mysql>SELECT *
FROM employees
WHERE
CASE
WHEN emp_no < 10010 THEN first_name LIKE 'S%'
ELSE 1
END limit 10;
+--------+------------+------------+-------------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-------------+--------+------------+
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
| 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 |
| 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 |
| 10013 | 1963-06-07 | Eberhardt | Terkki | M | 1985-10-20 |
| 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 |
| 10015 | 1959-08-19 | Guoxiang | Nooteboom | M | 1987-07-02 |
| 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 |
| 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 |
+--------+------------+------------+-------------+--------+------------+
10 rows in set (0.00 sec)
まとめ


- case whenで記述する検索case式では、複雑な条件を記述可能
- whereにcase式で条件分岐し、値が1となる場合は条件なし=全データ対象という条件になる
- case式はselectのカラム指定だけではなく、where内にも記述可能。