it-swarm.com.de

Warum gibt NOT IN mit einer Menge, die NULL enthält, immer FALSE / NULL zurück?

Ich hatte eine Abfrage (für Postgres und Informix) mit einem NOT IN -Klausel, die eine Unterabfrage enthält, die in einigen Fällen NULL -Werte zurückgibt, was dazu führt, dass diese Klausel (und die gesamte Abfrage) nichts zurückgibt.

Was ist der beste Weg, dies zu verstehen? Ich dachte an NULL als etwas ohne Wert und erwartete daher nicht, dass die Abfrage fehlschlagen würde, aber offensichtlich ist das nicht die richtige Art, an NULL zu denken.

21
newenglander

Boolesche Logik - oder Dreiwertige Logik

  • IN ist eine Abkürzung für eine Reihe von OR Bedingungen)
  • x NOT IN (1, 2, NULL) ist dasselbe wie NOT (x = 1 OR x = 2 OR x = NULL)
  • ... ist das gleiche wie x <> 1 AND x <> 2 AND x <> NULL
  • ... ist das gleiche wie true AND true AND unknown **
  • ... = unknown **
  • ... was in diesem Fall fast dasselbe ist wie false, da es die Bedingung WHERE nicht erfüllt **

Aus diesem Grund verwenden die Leute EXISTS + NOT EXISTS statt IN + NOT IN. Siehe auch Die Verwendung von NOT-Logik in Bezug auf Indizes für mehr

** Hinweis: unknown ist dasselbe wie false am Ende eines Ausdrucks in einer WHERE Bedingung.
Während der Ausdruck ausgewertet wird, ist er unbekannt
Siehe @ kgrittns Kommentar unten, warum

29
gbn