【BigQuery】CASE式の使い方とは?NULLを表示させない方法を紹介

BigQuery_CASE クラウドプラットフォーム

条件分岐といえばIF文を使いますよね.
ただ分岐先が多いときにIF文を使うとクエリが読みづらくなってしまいます.

そんなときはCASE式を使うと良いでしょう.

CASE式であれば条件式が多くても読みやすいクエリが書けます.

今回はCASE式の使い方や知っておくと便利な小ネタを紹介します.

CASE式とは

CASE式を使うと条件に合致したデータを変換することができます.
クエリを実行したときだけ値が変わるのでテーブルに影響はありません.

CASE式はBigQueryでも使え,次のように書きます.

CASE 式
  WHEN 条件 THEN 結果
  [...]
  [ ELSE その他の結果 ]
END

構文が変わっていてちょっと覚えづらいですね.

ポイントはこちらです.

  • CASEのあとに評価対象のカラムを置く
  • 評価対象のカラムが「条件」のとき「結果」を返すように書く
  • ELSEは「条件」に当てはまらないときの「結果」を書く

CASE式の使い方

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`
WHENの条件式にカラムを使う場合|クリックして拡大できます

条件式にカラムを使ったとき CASE の後のカラムは不要です.

CASE, WHEN どちらの後にもカラムがあるとエラーになるので注意しましょう!

CASE, WHENどちらの後にもカラムを書くとエラーになる|クリックして拡大できます

条件に合致しない値をNULLで表示させたくない場合

CASE のどの条件にも当てはまらない値は NULL として表示されます.

menuが「クランチ」のとき処理をコメントアウト|クリックして拡大できます

menu が「クランチ」だった場合の処理がないのでトレーニング部位は NULL になりました.

いまはメニューカラムがあるのでどのメニューに対応する条件式がないか分かります.

しかしメニューカラムがなかったり,条件式が複数欠けているとどの条件がないか探すのが大変です.(下の場合は「デッドリフト」と「クランチ」に対応する条件式がない)

どの条件式が抜けているか分からない|クリックして拡大できます

そんなときは ELSE のあとにカラム名を書きましょう!
ELSE のあとにカラム名を書くことで NULL の場合はカラムの値を表示します.

ELSEのあとにカラム名を書く|クリックして拡大できます
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 を使ってもカラムの値を表示することはできません.

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回避です.