✨
BigQueryでnullを考慮してイコールの評価をしたい
やりたいこと
BigQueryでカラムAとカラムBが一致しないレコードの件数を調べたいことがあったのですが、
A != B
とするとどちらか一方でもnullだと結果がnullになってしまいます。
- AもBもnullでない → 普通に評価
- Aだけnull or Bだけnull → not equal
- AもBもnull → equal
となるようにしたい。
解決方法
# equalの評価
coalesce(A = B, A is null and B is null)
# not equalの評価
not coalesce(A = B, A is null and B is null)
前述の通り、AかBどちらか一方でもnullだとA = B
の結果はnullです。
coalesceは引数の中の最初の非null式の値を返すので、AとBどちらもnullでない場合はA = B
の結果を、AかBどちらか一方でもnullの場合はA is null and B is null
の結果を返します。
- AもBもnullでない →
A = B
を評価 - Aだけnull or Bだけnull →
A is null and B is null
を評価 → not equal - AもBもnull →
A is null and B is null
を評価 → equal
という感じです。
この式をequal_respect_nullsなど名前つけてUDFにしてしまうと便利かもしれません。
CREATE OR REPLACE FUNCTION `<project>.<dataset>.equal_respect_nulls`(A ANY TYPE, B ANY TYPE) AS (
coalesce(A = B, A is null and B is null)
);
ボツ案
愚直な方法としてまず以下の式が思いつきました。
A = B or (A is null and B is null)
しかし、これだと2.のパターンがうまくいかないです。
論理演算子のドキュメントを見ると、null or false
の結果はnullとなってしまうことが分かります。
そこで、代わりにcoalesceを使ったのが解決方法に挙げた式です。
まとめ
coalesce、覚えておくとたまに役に立ちますね
Discussion