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を使用する