条件分岐といえばIF文を使いますよね.
ただ分岐先が多いときにIF文を使うとクエリが読みづらくなってしまいます.
そんなときはCASE式を使うと良いでしょう.
CASE式であれば条件式が多くても読みやすいクエリが書けます.
今回はCASE式の使い方や知っておくと便利な小ネタを紹介します.
CASE式とは
CASE式を使うと条件に合致したデータを変換することができます.
クエリを実行したときだけ値が変わるのでテーブルに影響はありません.
CASE式はBigQueryでも使え,次のように書きます.
CASE 式
WHEN 条件 THEN 結果
[...]
[ ELSE その他の結果 ]
END
構文が変わっていてちょっと覚えづらいですね.
ポイントはこちらです.
- CASEのあとに評価対象のカラムを置く
- 評価対象のカラムが「条件」のとき「結果」を返すように書く
- ELSEは「条件」に当てはまらないときの「結果」を書く
CASE式の使い方
CASE式を実際に使ってみましょう.
サンプルデータを用意しました.
中身はトレーニングメニューです
CASE式を使いメニューに対応するトレーニング部位カラムを追加します.
出力結果のイメージはこちらです.
メニュー | トレーニング部位 |
ベンチプレス | 胸 |
スクワット | 脚 |
デッドリフト | 背中 |
ショルダープレス | 肩 |
クランチ | お腹 |
クエリは次のようになりました.
SELECT
menu AS `メニュー`,
CASE menu
WHEN 'ベンチプレス' THEN '胸'
WHEN 'スクワット' THEN '脚'
WHEN 'デッドリフト' THEN '背中'
WHEN 'ショルダープレス' THEN '肩'
WHEN 'クランチ' THEN 'お腹'
END
AS `トレーニング部位`
FROM
`test.20231207_training_menu`
イメージ図通り出力できましたね.
このようにCASE式は1度に複数の条件を書く必要があるときに便利です.
CASE式の他の書き方
先程は CASE の後にカラムを書きました.
WHEN の後の条件式にカラムを使く方法もあります.
SELECT
menu AS `メニュー`,
CASE menu
WHEN 'ベンチプレス' THEN '胸'
WHEN 'スクワット' THEN '脚'
WHEN 'デッドリフト' THEN '背中'
WHEN 'ショルダープレス' THEN '肩'
WHEN 'クランチ' THEN 'お腹'
END
AS `トレーニング部位`
FROM
`test.20231207_training_menu`
条件式にカラムを使ったとき CASE の後のカラムは不要です.
CASE, WHEN どちらの後にもカラムがあるとエラーになるので注意しましょう!
条件に合致しない値をNULLで表示させたくない場合
CASE のどの条件にも当てはまらない値は NULL として表示されます.
menu が「クランチ」だった場合の処理がないのでトレーニング部位は NULL になりました.
いまはメニューカラムがあるのでどのメニューに対応する条件式がないか分かります.
しかしメニューカラムがなかったり,条件式が複数欠けているとどの条件がないか探すのが大変です.(下の場合は「デッドリフト」と「クランチ」に対応する条件式がない)
そんなときは ELSE のあとにカラム名を書きましょう!
ELSE のあとにカラム名を書くことで NULL の場合はカラムの値を表示します.
SELECT
CASE
WHEN menu = 'ベンチプレス' THEN '胸'
WHEN menu = 'スクワット' THEN '脚'
WHEN menu = 'ショルダープレス' THEN '肩'
ELSE
menu
END
AS `トレーニング部位`
FROM
`test.20231207_training_menu`
NULL ではなくメニュー名が表示されていますね.
これであればどの条件式が欠けているか一目瞭然でしょう.
データ量が多いときは ELSE カラム名を忘れずに書いておきましょう.
IS NULL は使えないのか?
値が NULL になるのであれば IS NULL を使えば変換できそうですよね.
しかし IS NULL を使ってもカラムの値を表示することはできません.
SELECT
CASE
WHEN menu = 'ベンチプレス' THEN '胸'
WHEN menu = 'スクワット' THEN '脚'
WHEN menu = 'ショルダープレス' THEN '肩'
WHEN menu IS NULL THEN 'その他'
END
AS `トレーニング部位`
FROM
`test.20231207_training_menu`
CASE式を使って表示されている NULL には IS NULL を使っても意味がないと分かりますね.
気をつけましょう.
まとめ
今回は BigQuery の CASE式 の使い方について紹介しました.
CASE式はちょっと特殊な構文です.
書き方も複数ありましたね.
- CASE のあとにカラム名を書く場合
- WHEN の条件式にカラムを書く場合
どちらか使いやすい方を選びましょう.
CASE, WHEN どちらの後にも書くとエラーになってしまいます.
また,条件式に当てはまらない場合は NULL で表示されました.
NULLだとどの条件式が欠けたか判断が付きません.
そのためにもCASE式の最後には ELSE カラム名を付けておきましょう!
これでNULL回避です.