Fai attenzione quando usi l’NOT IN in SQL

Attenzione all'uso del NOT IN in SQL

+ 3 soluzioni semplici per assicurarti di non essere scoperto

Recentemente, ho scoperto l’eccellente articolo di Benjamin Thürer:

Come evitare cinque errori comuni in Google BigQuery / SQL

Durante il lavoro con BigQuery da anni, ho osservato 5 problemi che vengono comunemente commessi, anche da data scientist esperti

towardsdatascience.com

…in cui ci mette in guardia sull’uso della clausola SQL NOT IN in BigQuery.

In questo articolo, amplierò ciò che ha detto fornendo ulteriori esempi, soluzioni e domande di pratica.

Se vuoi capire perché la clausola NOT IN è rischiosa – e cosa fare al riguardo – continua a leggere!

Il problema: NOT IN non gestisce gli NULL nel modo in cui potresti aspettarti

Gli operatori IN e NOT IN forniscono un modo logico per confrontare array. Ad esempio, se scrivi:

SELECT   3 IN (1, 2, 3) # Output = true

BigQuery restituirà true. Se scrivi:

SELECT   3 NOT IN (1, 2, 3) # Output = false

BigQuery restituirà false.

Sembra semplice, giusto? Ma c’è un problema: IN e NOT IN fanno strane cose quando l’array di ricerca contiene valori NULL. Ad esempio, il seguente codice restituirà NULL, non false:

SELECT  3 NOT IN (1, 2, NULL) # Output = NULL

Per capire perché questo è importante, dai uno sguardo a queste tre tabelle, ognuna delle quali contiene un elenco di nomi:

`table_1`      `table_2`      `table_3`+---------+    +---------+    +---------+| name    |    | name    |    | name    |+---------+    +---------+    +---------+| Matt    |    | Matt    |    | Matt    || Sam     |    | Sam     |    | Sam     || Frankie |    +---------+    | NULL    || Ben     |                   +---------++---------+

Se volessi trovare tutti i nomi in table_1 che non sono presenti in table_2, possiamo usare la clausola NOT IN:

SELECT nameFROM table_1WHERE name NOT IN (SELECT name FROM table_2)# Output# +---------+# | name    |# +---------+# | Frankie |# | Ben     |# +---------+

L’operatore NOT IN ci consente di trovare i due nomi corretti: “Frankie” e “Ben”. Nel gergo tecnico SQL, questa operazione è nota come “anti semi-join”…