Ich hatte eine Abfrage (für Postgres und Informix) mit einer NOT IN
Klausel, die eine Unterabfrage enthielt, die in einigen Fällen NULL
Werte zurückgab , was dazu führte, dass diese Klausel (und die gesamte Abfrage) nichts zurückgab .
Wie kann man das am besten verstehen? Ich dachte an NULL
etwas ohne Wert und erwartete daher nicht, dass die Abfrage fehlschlägt, aber offensichtlich ist dies nicht die richtige Art zu denken NULL
.
quelle
x <> NULL
beispielsweise eine Auflösung für anzeigenFALSE
, erwarten Sie, dassNOT (x <> NULL)
die Auswertung für erfolgtTRUE
, und dies ist nicht der Fall. Beide werten zu ausUNKNOWN
. Der Trick besteht darin, dass eine Zeile nur dann ausgewählt wird, wenn dieWHERE
Klausel (falls vorhanden) als - ausgewertet wird.TRUE
Eine Zeile wird weggelassen, wenn die Klausel entweder alsFALSE
oder ausgewertet wirdUNKNOWN
. Dieses Verhalten (im Allgemeinen und für dasNOT IN
Prädikat im Besonderen) wird vom SQL-Standard vorgeschrieben.NULL NOT IN (some_subquery)
sollte die äußere Zeilesome_subquery
nicht zurückgegeben werden, es sei denn, es werden keine Zeilen zurückgegeben. Aus diesem Grund kann der Ausführungsplan, wenn beide Spalten nullfähig sind, erheblich teurer sein. SQL Server-Beispiel