W SQL wartość NULL oznacza "nieznaną" lub "brakującą" wartość. Zachowuje się w szczególny sposób:
NULL z dowolną wartością za pomocą = lub <> zawsze daje wynik UNKNOWN, a nie TRUE lub FALSE.NULL należy przeprowadzać za pomocą IS NULL lub IS NOT NULL.NULL da NULL.Przykład:
SELECT * FROM users WHERE name = NULL; -- nie zwróci żadnego wiersza SELECT * FROM users WHERE name IS NULL; -- poprawne SELECT 1 + NULL; -- Wynik: NULL
Do zastępowania NULL używa się funkcji takich jak COALESCE(foo, 0) (bierze pierwszą wartość nie-NULL) lub ISNULL(foo, 'default') w SQL Server.
Pytanie: Jaki wynik zwróci warunek WHERE some_column <> 'value' w wierszach, gdzie some_column — NULL?
Odpowiedź:
W tych wierszach warunek nie zostanie spełniony: porównanie z NULL da UNKNOWN, a nie TRUE. Dlatego wiersze z NULL nie trafią do wyniku.
Przykład:
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Wiersz z NULL nie trafi
Historia
WHERE status <> 'closed' omyłkowo nie uwzględniał rachunków, których wartość status to NULL (na przykład nowe wnioski). W rezultacie nieprawidłowo policzono aktywne rachunki — liczba okazała się o 15% mniejsza.Historia
COALESCE(user_name, 'Szanowny kliencie') do wysyłki. Prawie tysiąc klientów otrzymało powitanie bez imienia, co odebrano jako błąd automatyzacji.Historia
Podczas migracji bazy danych LEFT JOIN zwracał więcej wierszy, niż oczekiwano. Okazało się, że w lewej tabeli były pola z NULL; filtry typu WHERE b.field = 'X' po JOIN odrzucały te wiersze, co skutkowało utratą części danych.