SQLのcase式で使うwhenについてまとめています。
※MySQLのサンプルデータベースEmployeesを使用しています。
SQLのwhenは、case式の分岐条件を記述する

case式では、分岐条件をwhenで指定した分だけ分岐条件を指定できます。
以下の例では、select文の対象カラムにcase式を使い、在職中の社員にemployement、退職した社員には退職日時を表示しています。
SELECT employees.first_name, employees.last_name, case when dept_emp.from_date < '2000-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 dept_emp.emp_no = employees.emp_no limit 10; +------------+-----------+------------+ | first_name | last_name | zaishoku | +------------+-----------+------------+ | xGeorgi | Facello | employment | | Bezalel | Simmel | employment | | Parto | Bamford | employment | | Chirstian | Koblick | employment | | Kyoichi | Maliniak | employment | | Anneke | Preusig | employment | | Tzvetan | Zielinski | employment | | Saniya | Kalloufi | 2000-07-31 | | Sumant | Peac | employment | | Duangkaew | Piveteau | 2000-06-26 | +------------+-----------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
CASE式のWHENでNULL判定をおこなうサンプル
whenの条件指定にはNULL判定も可能です。
下記のサンプルでは、社員番号499995 ~ 500000の社員に対してemp_no(社員番号)、first_name(名)、last_name(姓)を表示しています。first_nameがNULLの場合、UNKNOWNを表示しています。
mysql> desc employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | YES | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> insert into employees (emp_no, birth_date, first_name, last_name, gender, hire_date ) values ( 500000, "1970-01-01", NULL, "YAMADA", "M", "2000-04-01" ) ;
Query OK, 1 row affected (0.01 sec)
mysql> select * from employees where emp_no="500000";
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+--------+------------+------------+-----------+--------+------------+
| 500000 | 1970-01-01 | NULL | YAMADA | M | 2000-04-01 |
+--------+------------+------------+-----------+--------+------------+
1 row in set (0.00 sec)
mysql> select emp_no,
case when first_name IS NULL then 'UNKNOWN'
else first_name
end as first_name,
last_name
from employees
where emp_no between 499995 and 500000;
+--------+------------+-----------+
| emp_no | first_name | last_name |
+--------+------------+-----------+
| 499995 | Dekang | Lichtner |
| 499996 | Zito | Baaz |
| 499997 | Berhard | Lenart |
| 499998 | Patricia | Breugel |
| 499999 | Sachin | Tsukuda |
| 500000 | UNKNOWN | YAMADA |
+--------+------------+-----------+
6 rows in set (0.00 sec)
なお、employees(社員)テーブルのfirst_nameカラムにNULLを許可するため、以下のalter tableを実行しました。データ型以外が全てデフォルト設定となり、NULL許可に設定されます。
alter table employees modify column first_name varchar(14);
NULL判定には、=NULLではなく、IS NULL演算子を使用します。
【関連記事】
▶SQL isnullの使い方 NULL判定やNULL置換の方法 case式でも対応可能
まとめ


- whenはcase式の条件指定を記述する
- whenは複数指定が可能
- whenでNULL判定をおこなう場合は、IS NULLを使用する