「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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more