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.
- Cosa è LangChain? Utilizzo e vantaggi
- Ricercatori di Stanford e Salesforce AI svelano UniControl un modello di diffusione unificato per il controllo avanzato nella generazione di immagini AI.
- Il canale dei dati non strutturati
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”…