SQLの条件分岐についてまとめています。
SQLの条件分岐はCASE式を使用
SQLでCASE式を使うと、プログラム的な条件分岐が可能です。
以下のSQLは、departmentsテーブルのdept_name(部署名)がSalesならdept_checkにsales!を、それ以外ならnot sales!を返します。
SELECT `dept_no`, case `dept_name` when 'Sales' then 'sales!' else 'not sales!' end as dept_check FROM `departments`; +---------+------------+ | dept_no | dept_check | +---------+------------+ | d009 | not sales! | | d005 | not sales! | | d002 | not sales! | | d003 | not sales! | | d001 | not sales! | | d004 | not sales! | | d006 | not sales! | | d008 | not sales! | | d007 | sales! | +---------+------------+
【関連記事】
▶SQLのCASE式サンプル集 order byやgroup byとの組み合わせもバッチリ
case式でwhere句まるごと切り替えが可能
case式をwhere句で使うことで、条件記述部分を入れ替えることが可能です。
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 | +--------+------------+------------+------------+--------+------------+
上記の例は、gender(性別)がMの場合は比較カラムをbirth_date、Fの場合は比較カラムをhire_dateに変えています。
【関連記事】
▶SQLのwhereはcase式で条件切替が可能 条件の有り・無しを記述できる
また、条件のあり、なしを切り替えるには以下のように記述します。
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 | +--------+------------+------------+-------------+--------+------------+
条件式の箇所に1を指定すると、条件なしでクエリを実行することになります。
上記の場合、emp_no<10010の場合は、以下のクエリが実行されることになります。
mysql> select * from employees where 1 limit 10;
ストアドプロシジャ内では、if文による条件分岐が可能
case式は、あくまで値を返すだけでしたが、ストアドプロシジャやストアドプログラム内ではif文を記述して、条件分岐によって異なる処理を実行することが可能です。
例えば、MySQLやOracleの場合は以下のように記述します。
IF 条件式 THEN 処理文 ELSEIF 条件文 THEN 処理文 ELSE 処理文 END IF
記述方法は、DBMSごとに差異があります。
【関連記事】
▶SQL if文のサンプルコード集 NULL判定や、Switch文のような分岐をする方法 | 「ポテパンスタイル」
まとめ
- SQLの条件分岐はcase式で実現可能
- where句でcase式を使うと、条件文まるごとや比較するカラムの切り替えが可能
- ストアドプロシジャやストアドプログラム内ではif文で条件分岐して別々の処理実行が可能