W mojej tabeli mam kolumnę z zerową liczbą bitów (starszy system ...), a inny programista dokonał ostatnio zmiany w procedurze przechowywanej, aby pokazać tylko wartości, w których kolumna bitowa nie była prawdą (1). Ponieważ jest to kolumna zerowa, zauważyliśmy, że jeśli kolumna ma wartość NULL, rekord nie był odbierany. Dlaczego to?SQL: Dlaczego wartości NULL są odfiltrowane w ramach tej klauzuli where?
Zarówno inny programista, jak i ja zgadzamy się, że NULL <> 1 ... Czy jest to błąd w SQL lub został zaprojektowany w ten sposób? Wygląda jak wada projektowa.
Aktualny Kod:
(VoidedIndicator <> 1)
Proponowane Fix:
(VoidedIndicator <> 1 OR VoidedIndicator IS NULL)
Wyjaśnienie (Jon Erickson)
VoidedIndicator jest polem nieco pustych więc może mieć następujące wartości: NULL, 0, o R1
Gdy instrukcja SQL jest tworzony z WHERE takich jak (VoidedIndicator <> 1) dostajemy tylko rekordy zwrócone które mają VoidedIndicator == 0, ale spodziewaliśmy się zarówno VoidedIndicator == 0 i VoidedIndicator IS NULL. Dlaczego to?
Więc jeśli NULL nie jest równy cokolwiek, co mówisz, to w jaki sposób NULL nie zostanie w to uwzględnione? Kolumna <> 1 ... NULL nie równa się 1? Poprawny? – RSolberg
Każde porównanie z wartością NULL zwraca wartość false, tak więc NULL <> 1 ma wartość false. Do tego służy IS NULL lub IS NOT NULL. – cletus
Najlepszym sposobem myślenia o wartościach zerowych w terminologii bazy danych, słusznie lub niesłusznie, jest to, że wartość pusta jest "nieznana", dlatego nie może być porównywana z inną wartością zerową ani porównywana z konkretną wartością –