【SQL】CASE式を使って条件分岐させる

SQLでクエリを書いていると、条件分岐してデータを出し分けたい時があります。条件分岐ができれば、クエリの幅をさらに広げることができるでしょう。

SQLではCASE式を使えば簡単に条件分岐を実現することができます。

本記事では、CASE式とは何かから始まり、具体的な使い方について解説しています。

SQLのCASE式とは

CASE式はSQLで条件分岐を実現するための文法です。

条件分岐とは、Aの時はA’を表示する、Bの時はB’を表示するといったように、特定の条件を満たしているか否かで結果を変えることです。一般的にプログラムの用語として使われています。

条件分岐の方法として大きく下記2つの種類があります。

  • 値で条件分岐をする方法
  • 条件式で条件分岐をする方法

それぞれがどういうことなのかを詳しく解説していきます。

値で条件分岐をする方法

まず最初に、CASEを使って値で条件分岐する方法を見ていきます。

基本構文

SQL
SELECT
  CASE
    WHEN 値1 THEN 値1を満たした時に表示するデータ
    WHEN 値2 THEN 値2を満たした時に表示するデータ
    ...
    ELSE どの値も満たしていなかった時に表示するデータ
  END カラム名
FROM テーブル名;

考え方の順番は下記です。

  1. CASEENDで囲った中に条件を記載する
  2. 条件はWHENTHENを使って、1つの条件に付きWHEN 値 THEN 値を満たした時に表示するデータというフォーマットで記載する。WHENの後に記載した値を満たす時、THENの後に書いたデータを表示します
  3. 条件の数に応じてWHEN以下の行を追記する
  4. ENDの後にカラム名を記載する

具体例を見ていきましょう!

例1:最もシンプルなパターン

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnamegender
1山田0
2鈴木1
3佐藤0
4佐々木1
usersテーブル

検索クエリ

usersテーブルのgenderカラムの値を0の場合は「男性」、1の場合は「女性」に変換してレコードを取得する

SQL
SELECT
  id,
  name,
  CASE
    WHEN gender = 0 THEN '男性'
    WHEN gender = 1 THEN '女性'
  END gender
FROM users;

今回はgenderの値が0か1の2パターンしかないので、条件式を2つ記載します。文字データを表示するため、男性と女性の文字にはシングルクォーテーションを付けます。

また、ENDの後にはカラム名を指定する必要があるので、genderと記載します。

実行結果

idnamegender
1山田男性
2鈴木女性
3佐藤男性
4佐々木女性
usersテーブル

genderカラムが「男性」もしくは「女性」というデータに変換されて取得することができました。0か1で表示されるよりも格段に見やすいですね。

データを変更したと言っても、実際にデータベースのデータが書き変わっているという訳ではなく、あくまで表示するデータの見た目が変わっているだけです。

例2:条件分岐して新しいカラムを作成する

先ほどはgenderカラムの値を変更して取得しました。

一方で、CASEを使えば新しくカラムを作成してデータを取得することができます。
次にそのやり方を見ていきましょう。

サンプルデータ

下記のとおり、usersテーブルを用意します。

idnameaddress
1山田東京都
2鈴木宮城県
3佐藤奈良県
4佐々木千葉県
5丸山大阪府
6川島青森県
usersテーブル

検索クエリ

usersテーブルに新たにareaカラムを作成して、地域情報を追加した上でデータを取得する

SQL
SELECT
  id,
  name,
  address,
  CASE
    WHEN address IN ('青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県') THEN '東北'
    WHEN address IN ('東京都', '神奈川県', '千葉県', '埼玉県', '栃木県', '群馬県', '茨城県') THEN '関東'
    WHEN address IN ('大阪府', '京都府', '滋賀県', '兵庫県', '奈良県', '和歌山県') THEN '近畿'
  END area
FROM users;

IN句を使って、複数の都道府県を指定して条件分岐を行います。また、ENDの後にareaという新しいカラムを作成している点もポイントです。

【SQL】IN演算子を使ってWHEREの複数条件指定をシンプルにする

実行結果

idnameaddressarea
1山田東京都関東
2鈴木宮城県東北
3佐藤奈良県九州
4佐々木千葉県関東
5丸山大阪府近畿
6川島青森県東北
usersテーブル

実行結果では、areaという新しいカラムが作られて地域情報が取得できています。areaカラムはデータベースの中に作成された訳ではなく、あくまで目に見えるものとして表示させているだけです。

このように、CASE式を使えば条件分岐した結果を新しいカラムとして表示させることができます。

例3:ELSEを使うパターン

次は、ELSEを使ってそれ以外という条件を指定するケースを見ていきましょう。

サンプルデータ

下記のとおり、usersテーブルを用意します。permissionカラムは権限を表しており、0が管理者権限です。

idnamepermission
1山田3
2鈴木1
3佐藤0
4佐々木2

検索クエリ

権限が0なら「管理者権限」、0以外なら「一般権限」に変更してレコードを取得する

SQL
SELECT
  id,
  name,
  CASE
    WHEN permission = 0 THEN '管理者権限'
    ELSE '一般権限'
  END permission
END;

ELSEを使って、0以外の場合は一般権限となるように指定しています。

このように、特定の条件以外は同じ表示でOKな場合はELSEを使うことで簡潔なクエリにできます。

実行結果

idnamepermission
1山田一般権限
2鈴木一般権限
3佐藤管理者権限
4佐々木一般権限

数値で表示されていたpermissionの値を文字に変換したことで、第三者からも分かりやすくなりました。

条件式で条件分岐をする方法

ここまでは値を指定して条件分岐をする方法を見てきました。

次に、条件式を指定して条件分岐する方法を見ていきます。

基本構文

SQL
SELECT
  CASE
    WHEN 条件式1 THEN 条件式1を満たした時に表示するデータ
    WHEN 条件式2 THEN 条件式2を満たした時に表示するデータ
    ...
    ELSE どの条件式も満たしていなかった時に表示するデータ
  END カラム名
FROM テーブル名;

考え方はこれまでと同じです。先ほどは値で条件分岐していたものが、条件式に変わっただけです。

サンプルデータ

下記のとおり、usersテーブルを用意します。heightカラムは身長を意味します。

idnameheight
1山田163
2鈴木190
3佐藤175
4佐々木169
5丸山182
usersテーブル

検索クエリ

下記のとおり、身長の高さに応じてステータスを付けてレコードを取得する

  • 身長164cm以下 → 低身長
  • 身長165cm ~ 174cm → 標準身長
  • 身長175cm以上 → 高身長
SQL
SELECT
  id,
  name,
  CASE
    WHEN height < 165 THEN '低身長'
    WHEN 165 <= height < 175 THEN '標準身長'
    WHEN 175 <= height THEN '高身長'
  END height_status
FROM users;

height < 165のように不等号を用いて、条件式によって条件分岐を行なっています。

実行結果

idnameheightheight_status
1山田163低身長
2鈴木190高身長
3佐藤174標準身長
4佐々木169標準身長
5丸山182高身長
usersテーブル

各条件に該当するステータスが割り当てられたheight_statusカラムが作成されました。

このように、条件式を使うことで条件分岐の幅を広げることができます

内容のまとめ

  • 条件分岐は特定の条件を満たしているか否かで結果を変えること
  • CASE式はSQLで条件分岐を実現するための文法で、値で分岐させる方法と条件式で分岐させる方法の2種類ある
  • CASE式はCASEENDで囲った中に、WHEN 値 THEN 値を満たした時に表示するデータを条件の数だけ記載していく
  • ENDの後にカラム名をつける必要があるが、既存の存在しないカラム名を指定することで新しいカラムを作成することができる
  • 特定の条件以外を指定する場合はELSEを使うことで簡潔なクエリにできる