条件式
SQL入門の6回目は条件式です。Case, If, Coalesceなどについて学習します。where句の後ろに条件式を記述することで、条件を満たす行だけを抽出することが可能です。havingを使用すればグループ化したあとのグループに対して条件式を適用することもできます。
このように行やグループに対して条件を記述するだけでなく、select命令で列を記述するところに条件を記述することができます。
本章では上記イメージに示すよう、「列を記述するところに、条件式を使って出力を加工する方法」について説明します。
本記事はFuture Coders独自教材からの引用です。
目次
CASE
一般的なプログラミングにおけるswitchやif ~ else if ~ elseといった文法を記述することで、列に表示する内容を制御する命令です。CASE命令は2つの使い方があります。どちらの方法を使用しているか混乱しないよう注意してください。
- if ~ else if ~ else的な使い方
- switch的な使い方
CASE1: if ~ else if ~ else的な使い方
条件を列挙してゆき、条件を満たしたところの値を返します。文法は以下の通りです。
case
when 条件1 then 値1
when 条件2 then 値2
when 条件3 then 値3
else 値4
end
JavaScritpなどの一般的なプログラミング言語であれば以下のような記述と似ています。
if (条件1) {
return 値1
}elseif (条件2){
return 値2
}elseif (条件3){
return 値3
}else{
return 値4
}
以下年齢に応じてyoung, middle, seniorと値を設定するサンプルです。
SELECT
dob_age,
casewhen dob_age <30then "young"
when dob_age <60then "middle"
else "senior"
endas generation
FROM `sample.people`
CASE2: switch命令的な使い方
ある値(式)を指定して、その値に応じて変換後の値を記述する方法です。caseの直後にwhenが来るのではなく、列名などの式がくることに注意してください。
case 式
when 値1 then 戻り値1
when 値2 then 戻り値2
when 値3 then 戻り値3
else 戻り値4
end
JavaやCなどの一般的なプログラミング言語であれば以下のようなswitch文と似ています。
switch (式) {
case 値1: return 戻り値1;
case 値2: return 戻り値2;
case 値3: return 戻り値3;
default: return 戻り値4;
}
以下はArea_IDを別の名前に変換する例です。
SELECT Area_ID,
case Area_ID
when "A" then "Park1"
when "B" then "Park2"
when "C" then "Park3"
else "Park4"
endas Area
FROM `sample.squirrel-data`
IF
IF命令は以下のように条件を記述し、成立したとき、成立しなかったときと値を記述します。
IF(条件, 成立時の値, 非成立時の値)
以下はpeopleテーブルでgenderの値(female/male)をM/Fに変換する例です。
SELECT gender, if (gender="male", "M", "F") as MF
FROM `sample.people`
COALESCE
COALESCE関数は、複数の引数を受け取り、左から順番に値を調べ、最初にNULLでなかった値を返します。一般的に、値がない場合にはNULLが埋められます。そのNULLをデフォルト値に変換するときなどによく利用されます。
文法は以下の通りです。
COALESCE(値1, 値2, ...)
以下はpeopleテーブルでid_nameがnullの時に”default”という文字で埋める例です。
SELECT id_name, coalesce(id_name, "default") as id_name
FROM `sample.people`
演習
ex-cond1.py
peopleテーブルで、id_nameの値に応じて、CPF=1, SIN=2, SSN=3, TFN=4, null=5となるid_num列を追加してください。switchと同じパターンのcaseを使用してください。
ex-cond2.py
peopleテーブルで40歳未満が”中堅”, 60歳未満が”ベテラン”, それ以上が”シニア”となる列、age_category列を追加してください。
ex-cond3.py
squirrel-dataテーブルでPrimary_Fur_Color列の値がBlackなら”黒”, Grayなら”グレー”, Cinnamonなら”シナモン”, nullなら”不明”と変換してください。switchと同じパターンのcaseを使用してください。
ex-cond4.py
if命令を使って、peopleテーブルで60歳未満なら通常料金、そうでなければシニア料金と表示する列priceを追加してください。
ex-cond5.py
squirrel-dataテーブルでcoalesceを使って、Specific_Locationがnullの時に”unknown”と表示する列locationを追加してください。
解答例
ex-cond1.py
SELECT id_name,
case id_name
when "CPF" then1when "SIN" then2when "SSN" then3when "TFN" then4else5endFROM `sample.people` LIMIT 1000
ex-cond2.py
SELECT dob_age,
casewhen dob_age <40then "中堅"
when dob_age <60then "ベテラン"
else "シニア"
endas age_category
FROM `sample.people` LIMIT 1000
ex-cond3.py
SELECT Primary_Fur_Color,
case Primary_Fur_Color
when "Black" then "黒"
when "Gray" then "グレー"
when "Cinnamon" then "シナモン"
else "不明"
endas Iro
FROM `sample.squirrel-data`
ex-cond4.py
SELECT dob_age, if(dob_age <60, "通常料金", "シニア料金") as price
FROM `sample.people`
ex-cond5.py
SELECT Specific_Location, COALESCE(Specific_Location, "unknown") as location
FROM `sample.squirrel-data`