SQLでクエリを書いていると、条件分岐してデータを出し分けたい時があります。条件分岐ができれば、クエリの幅をさらに広げることができるでしょう。
SQLではCASE式を使えば簡単に条件分岐を実現することができます。
本記事では、CASE式とは何かから始まり、具体的な使い方について解説しています。
目次
SQLのCASE式とは
CASE式はSQLで条件分岐を実現するための文法です。
条件分岐とは、Aの時はA’を表示する、Bの時はB’を表示するといったように、特定の条件を満たしているか否かで結果を変えることです。一般的にプログラムの用語として使われています。
条件分岐の方法として大きく下記2つの種類があります。
- 値で条件分岐をする方法
- 条件式で条件分岐をする方法
それぞれがどういうことなのかを詳しく解説していきます。
値で条件分岐をする方法
まず最初に、CASEを使って値で条件分岐する方法を見ていきます。
基本構文
SELECT
CASE
WHEN 値1 THEN 値1を満たした時に表示するデータ
WHEN 値2 THEN 値2を満たした時に表示するデータ
...
ELSE どの値も満たしていなかった時に表示するデータ
END カラム名
FROM テーブル名;
考え方の順番は下記です。
CASE
とEND
で囲った中に条件を記載する- 条件は
WHEN
とTHEN
を使って、1つの条件に付きWHEN 値 THEN 値を満たした時に表示するデータ
というフォーマットで記載する。WHEN
の後に記載した値を満たす時、THEN
の後に書いたデータを表示します - 条件の数に応じて
WHEN
以下の行を追記する END
の後にカラム名を記載する
具体例を見ていきましょう!
例1:最もシンプルなパターン
サンプルデータ
下記のとおり、usersテーブルを用意します。
id | name | gender |
---|---|---|
1 | 山田 | 0 |
2 | 鈴木 | 1 |
3 | 佐藤 | 0 |
4 | 佐々木 | 1 |
検索クエリ
usersテーブルのgenderカラムの値を0の場合は「男性」、1の場合は「女性」に変換してレコードを取得する
SELECT
id,
name,
CASE
WHEN gender = 0 THEN '男性'
WHEN gender = 1 THEN '女性'
END gender
FROM users;
今回はgenderの値が0か1の2パターンしかないので、条件式を2つ記載します。文字データを表示するため、男性と女性の文字にはシングルクォーテーションを付けます。
また、END
の後にはカラム名を指定する必要があるので、gender
と記載します。
実行結果
id | name | gender |
---|---|---|
1 | 山田 | 男性 |
2 | 鈴木 | 女性 |
3 | 佐藤 | 男性 |
4 | 佐々木 | 女性 |
genderカラムが「男性」もしくは「女性」というデータに変換されて取得することができました。0か1で表示されるよりも格段に見やすいですね。
データを変更したと言っても、実際にデータベースのデータが書き変わっているという訳ではなく、あくまで表示するデータの見た目が変わっているだけです。
例2:条件分岐して新しいカラムを作成する
先ほどはgenderカラムの値を変更して取得しました。
一方で、CASEを使えば新しくカラムを作成してデータを取得することができます。
次にそのやり方を見ていきましょう。
サンプルデータ
下記のとおり、usersテーブルを用意します。
id | name | address |
---|---|---|
1 | 山田 | 東京都 |
2 | 鈴木 | 宮城県 |
3 | 佐藤 | 奈良県 |
4 | 佐々木 | 千葉県 |
5 | 丸山 | 大阪府 |
6 | 川島 | 青森県 |
検索クエリ
usersテーブルに新たにareaカラムを作成して、地域情報を追加した上でデータを取得する
SELECT
id,
name,
address,
CASE
WHEN address IN ('青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県') THEN '東北'
WHEN address IN ('東京都', '神奈川県', '千葉県', '埼玉県', '栃木県', '群馬県', '茨城県') THEN '関東'
WHEN address IN ('大阪府', '京都府', '滋賀県', '兵庫県', '奈良県', '和歌山県') THEN '近畿'
END area
FROM users;
IN句を使って、複数の都道府県を指定して条件分岐を行います。また、END
の後にareaという新しいカラムを作成している点もポイントです。
実行結果
id | name | address | area |
---|---|---|---|
1 | 山田 | 東京都 | 関東 |
2 | 鈴木 | 宮城県 | 東北 |
3 | 佐藤 | 奈良県 | 九州 |
4 | 佐々木 | 千葉県 | 関東 |
5 | 丸山 | 大阪府 | 近畿 |
6 | 川島 | 青森県 | 東北 |
実行結果では、areaという新しいカラムが作られて地域情報が取得できています。areaカラムはデータベースの中に作成された訳ではなく、あくまで目に見えるものとして表示させているだけです。
このように、CASE式を使えば条件分岐した結果を新しいカラムとして表示させることができます。
例3:ELSEを使うパターン
次は、ELSE
を使ってそれ以外という条件を指定するケースを見ていきましょう。
サンプルデータ
下記のとおり、usersテーブルを用意します。permissionカラムは権限を表しており、0が管理者権限です。
id | name | permission |
---|---|---|
1 | 山田 | 3 |
2 | 鈴木 | 1 |
3 | 佐藤 | 0 |
4 | 佐々木 | 2 |
検索クエリ
権限が0なら「管理者権限」、0以外なら「一般権限」に変更してレコードを取得する
SELECT
id,
name,
CASE
WHEN permission = 0 THEN '管理者権限'
ELSE '一般権限'
END permission
END;
ELSE
を使って、0以外の場合は一般権限となるように指定しています。
このように、特定の条件以外は同じ表示でOKな場合はELSEを使うことで簡潔なクエリにできます。
実行結果
id | name | permission |
---|---|---|
1 | 山田 | 一般権限 |
2 | 鈴木 | 一般権限 |
3 | 佐藤 | 管理者権限 |
4 | 佐々木 | 一般権限 |
数値で表示されていたpermissionの値を文字に変換したことで、第三者からも分かりやすくなりました。
条件式で条件分岐をする方法
ここまでは値を指定して条件分岐をする方法を見てきました。
次に、条件式を指定して条件分岐する方法を見ていきます。
基本構文
SELECT
CASE
WHEN 条件式1 THEN 条件式1を満たした時に表示するデータ
WHEN 条件式2 THEN 条件式2を満たした時に表示するデータ
...
ELSE どの条件式も満たしていなかった時に表示するデータ
END カラム名
FROM テーブル名;
考え方はこれまでと同じです。先ほどは値で条件分岐していたものが、条件式に変わっただけです。
サンプルデータ
下記のとおり、usersテーブルを用意します。heightカラムは身長を意味します。
id | name | height |
---|---|---|
1 | 山田 | 163 |
2 | 鈴木 | 190 |
3 | 佐藤 | 175 |
4 | 佐々木 | 169 |
5 | 丸山 | 182 |
検索クエリ
下記のとおり、身長の高さに応じてステータスを付けてレコードを取得する
- 身長164cm以下 → 低身長
- 身長165cm ~ 174cm → 標準身長
- 身長175cm以上 → 高身長
SELECT
id,
name,
CASE
WHEN height < 165 THEN '低身長'
WHEN 165 <= height < 175 THEN '標準身長'
WHEN 175 <= height THEN '高身長'
END height_status
FROM users;
height < 165
のように不等号を用いて、条件式によって条件分岐を行なっています。
実行結果
id | name | height | height_status |
---|---|---|---|
1 | 山田 | 163 | 低身長 |
2 | 鈴木 | 190 | 高身長 |
3 | 佐藤 | 174 | 標準身長 |
4 | 佐々木 | 169 | 標準身長 |
5 | 丸山 | 182 | 高身長 |
各条件に該当するステータスが割り当てられたheight_statusカラムが作成されました。
このように、条件式を使うことで条件分岐の幅を広げることができます。
内容のまとめ
- 条件分岐は特定の条件を満たしているか否かで結果を変えること
- CASE式はSQLで条件分岐を実現するための文法で、値で分岐させる方法と条件式で分岐させる方法の2種類ある
- CASE式は
CASE
とEND
で囲った中に、WHEN 値 THEN 値を満たした時に表示するデータ
を条件の数だけ記載していく END
の後にカラム名をつける必要があるが、既存の存在しないカラム名を指定することで新しいカラムを作成することができる- 特定の条件以外を指定する場合は
ELSE
を使うことで簡潔なクエリにできる