Developer

【SQL基礎】CASE式の基本構文 単純CASE式と検索CASE式
2021.02.28
Lv1

【SQL基礎】CASE式の基本構文 単純CASE式と検索CASE式

SQLでは、CASE式を用いることで条件分岐を表現することができます。
「ケースバイケース」という表現に出てくる”CASE”のイメージです。
「Aの場合にはBの処理をしてほしい」というときに便利な表現です。
CASE式はSELECT文UPDATE文で使います。


WHERE句やHAVING句との違い

条件を設定できるものとしてWHERE句HAVING句がありますが、これらの句では取得するデータを絞り込むことしかできません。
例えば、年齢が30歳以上(age >= 30)のデータを取得する場合や、値段が1000円(price = 1000)のデータを取得する場合であれば、WHERE句やHAVING句で指定すれば実現できます。

CASE式を用いると、設定した条件を元に何らかの処理をすることが可能です。
例えば、年齢が30歳以上39歳以下の人のデータには”30代”という文字列を添えて出力する、値段が1000円のデータには”目玉商品”という文字列を添えて出力する、といったことが可能になります。


二つのCASE式

CASE式は単純CASE式検索CASE式の二種類があります。
単純CASE式は簡潔な表現である反面、できることは限定的です。
単純CASE式で表現できることは検索CASE式でも表現できます。
検索CASE式は等号以外の表現が使える、NULLを評価できるといった柔軟性があります。

本記事では例として以下のテーブル(テーブル名:teachers)を使用します。


1.単純CASE式

単純CASE式の書式は以下の通りです。

CASE 条件の対象となるカラム名
WHEN 条件A THEN 処理A
WHEN 条件B THEN 処理B
ELSE 処理C
END

WHEN句で書いた条件に該当する場合にTHEN句の処理を行います。
WHEN句の条件のいずれにも当てはまらない場合はELSE句の処理を行います。

例1.teachersテーブルから全てのカラムのデータを取得し、addressカラムの値が”東京都”であるデータには”都民”と表示して、”埼玉県”であるデータには”県民”と表示する。
※カラム名が長くなるのでAS句を用いて”例1″という別名を付けています。

SELECT *,                 // 全てのカラムを取得
CASE address               // addressカラムを対象として条件分岐
WHEN '東京都' THEN '都民'   // "東京都"であれば"都民"
WHEN '埼玉県' THEN '県民'   // "埼玉県"であれば"県民"
ELSE '道民か府民か県民'     // "東京都"でも"埼玉県"でもなければ"道民か府民か県民"
END AS '例1'          // CASE式のカラムに"例1"という別名をつける
FROM teachers;             // teachersテーブルからデータを取得


2.検索CASE式

検索CASE式の書式は以下の通りです。

CASE
WHEN 条件A THEN 処理A
WHEN 条件B THEN 処理B
ELSE 処理C
END

単純CASE式と違ってCASEの直後に条件の対象を指定しません。
条件についてはすべてWHEN句で指定します。
例1と同じ処理を検索CASE式で書いてみましょう。

例2-1.teachersテーブルから全てのカラムのデータを取得し、addressカラムの値が”東京都”であるデータには”都民”と表示して、”埼玉県”であるデータには”県民”と表示する。
※カラム名が長くなるのでAS句を用いて”例2-1″という別名を付けています。

SELECT *,
CASE
WHEN address = '東京都' THEN '都民'
WHEN address = '埼玉県' THEN '県民'
ELSE '道民か府民か県民'
END AS '例2-1'
FROM teachers;

 

 


検索CASE式の特徴である不等号やNULLを扱う例も見てみましょう。

例2-2.teachersテーブルから全てのカラムのデータを取得し、scoreカラムの値が80以上であるデータには”成績優秀”、NULLの場合には”成績不明”、それ以外の場合には”成績普通”と表示する。
※カラム名が長くなるのでAS句を用いて”例2-2″という別名を付けています。

SELECT *,
CASE
WHEN score >= 80 THEN '成績優秀'
WHEN score IS NULL THEN '成績不明'
ELSE '成績普通'
END AS '例2-2'
FROM teachers;


学習のポイント

・CASE式を用いることで条件分岐を表現できる。
・検索CASE式の方が表現の幅が広く扱いやすい。


練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.zip

[sql] CREATE DATABASE worldcup2014;

use worldcup2014

source C:\worldcup2014.sql
[/sql]

1.2014年ワールドカップ開催時の世界ランキング1位の国には”王者”、2位~9位の国には”強豪”、それ以外の国には”チャレンジャー”というふうに分類を行ってください。
countriesテーブル(id,name,ranking,group_nameの4つのカラムで構成されている)を使って答えを導いてください。また、分類を行ったカラムには何らかの別名を付けてください。

答え
[sql] SELECT ranking, name,
CASE
WHEN ranking = 1 THEN ‘王者’
WHEN 2 <= ranking && ranking <= 9 THEN ‘強豪’
ELSE ‘チャレンジャー’
END AS ‘立場’
FROM countries
ORDER BY ranking;
[/sql]

(実行結果は一部省略)

 

CASE式を使ってrankingカラムの値の条件を指定しています。AS句を用いてカラムの別名を”立場”にしています。

見やすさのためにORDER BY句でランキング順にソートを行っています。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ