【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式の方が表現の幅が広く扱いやすい。
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにして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つのカラムで構成されている)を使って答えを導いてください。また、分類を行ったカラムには何らかの別名を付けてください。