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文で条件分岐して別々の処理実行が可能