「SQLで「NOT IN」を使用する際には注意してください」
「「NOT IN」を使用する際にはSQLで注意が必要です」
+ 思わぬトラブルに巻き込まれないための3つの簡単な解決策
最近、ベンジャミン・テューラーの優れた記事を見つけました。
Google BigQuery / SQL でよくある5つの失敗を回避する方法
長年BigQueryを使っているうちに、経験豊富なデータサイエンティストでもよく起こる5つの問題を観察しました
towardsdatascience.com
…その中で彼はBigQueryでのNOT IN
SQL句の使用に注意を促しています。
この記事では、彼の言ったことをより具体的な例、対策、練習問題を提供することで拡大します。
NOT IN
句がなぜリスクがあるのか理解したい場合、読み続けてください!
問題: NOT INはNULLを予期した方法で処理しません
IN
およびNOT IN
演算子は、配列を比較する論理的な方法を提供します。例えば、以下を書くと:
SELECT 3 IN (1, 2, 3) # 出力 = true
BigQueryはtrue
を返します。以下を書くと:
SELECT 3 NOT IN (1, 2, 3) # 出力 = false
BigQueryはfalse
を返します。
簡単そうですね。しかし、問題があります。IN
およびNOT IN
は、検索配列にNULL
値が含まれる場合に奇妙な動作をします。例えば、以下のコードはfalse
ではなくNULL
を返します:
SELECT 3 NOT IN (1, 2, NULL) # 出力 = NULL
これがなぜ重要かを確認するために、次の3つのテーブルを見てみましょう。それぞれには名前のリストが含まれています:
`table_1` `table_2` `table_3`+---------+ +---------+ +---------+| name | | name | | name |+---------+ +---------+ +---------+| Matt | | Matt | | Matt || Sam | | Sam | | Sam || Frankie | +---------+ | NULL || Ben | +---------++---------+
table_2
に存在しないtable_1
の名前をすべて見つけたい場合、NOT IN
句を使用します:
SELECT nameFROM table_1WHERE name NOT IN (SELECT name FROM table_2)# 出力# +---------+# | name |# +---------+# | Frankie |# | Ben |# +---------+
NOT IN
演算子を使用することで、「Frankie」と「Ben」という2つの正しい名前を見つけることができます。技術的なSQL用語では、この操作を「アンチセミジョイン」と呼びます…
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles