

データの分析や処理に便利なBigQuery(BQ)。
大規模データの処理に優れており、テーブルに保存した大きなデータでも短時間で集計することができる。
ただしデータは常にキレイに処理できるとは限らない。
ときにはカラムの値がNULLになっていて、別の値を代用しなければいけないこともある。
しかしどうやって値を代用すればいいのか。
そこで今回はBigQueryで値がNULLだったら別のカラム値を使う方法について紹介する。
この記事を書いている人

記事を読むメリット
BigQueryで値がNULLだったら別のカラム値を使う方法がわかり、データ処理が楽になる
データ準備

ではまずデータを準備する。
以下のCSVを null_sample というテーブルとして取り込む。
col1,col2,col3 a,b,c ,b,c ,,c a,b, a,,
すると以下のようなテーブルとなる。
| Row | col1 | col2 | col3 |
| 1 | null | b | c |
| 2 | null | null | c |
| 3 | a | b | c |
| 4 | a | b | null |
| 5 | a | null | null |
BigQueryで値がNULLだったら別のカラム値を使う方法

BigQueryでカラムの値がNULLだったら別のカラム値を使う方法は2つある。
NULLだったら別の値を使う方法
個々に紹介していく。
IFNULL

「NULLだったら」という文言を聞いてまず思い浮かぶのが IF だろう。
そして値がNULLのときは専用関数として IFNULL が用意されている。
使い方は IFNULL() の第1引数にNULL判定したいカラム、第2引数に第1引数がNULLだっだときの代わりの値を指定する。
SELECT col1, col2, col3, IFNULL(col1,col2) as f FROM test.null_sample
結果は以下の通り。
| Row | col1 | col2 | col3 | f |
| 1 | null | b | c | b |
| 2 | null | null | c | null |
| 3 | a | b | c | a |
| 4 | a | b | null | a |
| 5 | a | null | null | a |
col1がnullである1行目と2行目はcol2の値を持ってきている。
しかしここで問題が。
col1がNULLだったらcol2、さらにcol2がNULLだったらcol3を持ってくるという場合はどうしたらいいのか。
その際は IFNULL をネストして使うことになる。
SELECT col1, col2, col3, IFNULL(col1,IFNULL(col2,col3)) as f FROM test.null_sample
| Row | col1 | col2 | col3 | f |
| 1 | null | b | c | b |
| 2 | null | null | c | c |
| 3 | a | b | c | a |
| 4 | a | b | null | a |
| 5 | a | null | null | a |


COALESCE

BigQueryで値がNULLだったら別のカラム値を使うもうひとつの方法が COALESCE だ。
COALESCE() には複数の引数が指定でき、その中で最初のNULLでない値を返す。
なので IFNULL と違ってネストせずに使うことができる。
SELECT col1, col2, col3, COALESCE(col1,col2,col3) as f FROM test.null_sample
| Row | col1 | col2 | col3 | f |
| 1 | null | b | c | b |
| 2 | null | null | c | c |
| 3 | a | b | c | a |
| 4 | a | b | null | a |
| 5 | a | null | null | a |

まとめ

今回はBigQueryで値がNULLだったら別のカラム値を使う方法について紹介した。
BigQueryで、値がNULLだったら別のカラム値を使う方法は2つ。
NULLだったら別の値を使う方法
IFNULL は IF と同じような感覚で使用できるが、NULL判定できるカラムまたは計算式は1つ。
COALESCE は2つ以上の引数を指定でき、その中で最初のNULLではない値を返すので、複数カラムのNULL判定したいときに便利。


