Miałem zapytanie (dla Postgres i Informix) z NOT IN
klauzulą zawierającą podzapytanie, które w niektórych przypadkach zwracało NULL
wartości, powodując, że ta klauzula (i całe zapytanie) niczego nie zwróciła.
Jak najlepiej to zrozumieć? Myślałem o NULL
czymś bez wartości i dlatego nie spodziewałem się, że zapytanie zakończy się niepowodzeniem, ale oczywiście nie jest to właściwy sposób myślenia NULL
.
źródło
x <> NULL
jak postanawiającFALSE
, można się spodziewaćNOT (x <> NULL)
, aby ocenić naTRUE
, a tak nie jest. Obaj oceniają naUNKNOWN
. Sztuczka polega na tym, że wiersz jest wybierany tylko wtedy, gdyWHERE
klauzula (jeśli jest obecna) ocenia naTRUE
- wiersz jest pomijany, jeśli klauzula ocenia na jedenFALSE
lubUNKNOWN
. To zachowanie (ogólnie, aNOT IN
zwłaszcza predykat) jest wymagane przez standard SQL.NULL NOT IN (some_subquery)
powinien również zwracać zewnętrznego wiersza, chyba żesome_subquery
nie zwróci żadnych wierszy. Dlatego plan wykonania, gdy obie kolumny mają wartość Null, może być znacznie droższy. Przykład serwera SQL