SQLのwhereにcase式を使うサンプルをまとめてます。
MySQLのサンプルデータベースEmployeesを使用しています。
SQLのwhereでcase式を使って条件の切り替えが可能
where句でcase式を使うと、条件指定を切り替えることが可能です。
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
例えば、カラム名を指定する箇所をcase式で置き換えることで、条件対象カラムを切り替えることが可能です。
以下のサンプルでは、gender(性別)がM(男性)の場合はbirth_date(誕生日)、F(女性)の場合はhire_date(雇用日)が1970年1月1日以降のデータを10件表示します。
mysql> select * from employees where case when gender="M" then birth_date when gender="F" then hire_date end > '1970-01-01' limit 10; +--------+------------+------------+------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 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 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | | 10023 | 1953-09-29 | Bojan | Montemayor | F | 1989-12-17 | | 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 | +--------+------------+------------+------------+--------+------------+ 10 rows in set (0.00 sec)
条件の有無をcase式で記述するサンプル
対象カラムだけではなく、条件の有り・無しの切り替えも可能です。
以下のサンプルは、emp_no(社員番号)が10010未満の場合はfirst_name(名)がBから始まるという条件を追加し、それ以外は条件なしでemployees(社員)テーブルから10件取得する例です。
mysql> select * from employees where case when emp_no < 10010 then first_name like 'B%' else 1 end limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 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 | | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | +--------+------------+------------+-------------+--------+------------+ 10 rows in set (0.00 sec)
else 1とすることで、emp_noが10010以上の場合は無条件で真となります。
具体的には、emp_noが10010未満の場合は以下のSQLに置き換えられます。
mysql> select * from employees where first_name like 'B%'
emp_noが10010以上の場合は、以下のSQLに置き換えられます。無条件でselectすることになります。
mysql> select * from employees where 1
SQLだけで複雑な条件分岐が実現できるんですね。
まとめ
- case式でwhere句の条件を切り替え可能
- カラム名記述箇所にcase式を記述すると対象カラムを切り替えることができる
- 条件自体の有無をcase式で指定することも可能