В SQL значение NULL обозначает "неизвестное" или "отсутствующее" значение. Оно ведёт себя по-особому:
NULL с любым значением через = или <> всегда даёт результат UNKNOWN, а не TRUE или FALSE.NULL нужно с помощью IS NULL или IS NOT NULL.NULL даст NULL.Пример:
SELECT * FROM users WHERE name = NULL; -- не вернёт ни одной строки SELECT * FROM users WHERE name IS NULL; -- корректно SELECT 1 + NULL; -- Результат: NULL
Для замены NULL используют функции вроде COALESCE(foo, 0) (берёт первое не-NULL значение) или ISNULL(foo, 'default') в SQL Server.
Вопрос: Какой результат вернёт условие WHERE some_column <> 'value' в строках, где some_column — NULL?
Ответ:
В этих строках условие не выполнится: сравнение с NULL даст UNKNOWN, а не TRUE. Поэтому строки с NULL не попадут в выборку.
Пример:
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Строка с NULL не попадёт
История
WHERE status <> 'closed' ошибочно не учитывало счета со значением status = NULL (например, новые заявки). В результате некорректно посчитали активные счета — число оказалось на 15% меньше.История
COALESCE(user_name, 'Уважаемый клиент') забыли добавить в рассылку. Почти тысячи клиентов получили обращения без имени вообще, что восприняли как ошибку автоматизации.История
При миграции базы LEFT JOIN возвращал больше строк, чем ожидали. Оказалось, в левой таблице были поля с NULL; фильтры вида WHERE b.field = 'X' после JOIN отбрасывали эти строки, отчего часть данных потерялась.