Антипаттерн: игнорирование поведения NULL в SQL

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
10,005
Реакции
1,564
Credits
35,671
Антипаттерн: игнорирование поведения NULL в SQL
Когда ты пишешь WHERE column != 'value', ты можешь думать, что фильтруешь всё, что не равно 'value'. Но если в колонке есть NULL, такие строки выпадут из выборки. Почему? Потому что NULL != 'value' даёт… UNKNOWN, а не TRUE.

Пример проблемы:
SQL:
SELECT * FROM users
WHERE status != 'active';
Если status у кого-то NULL — он не попадёт в результат. Неочевидно, но критично.

✔️ Как избежать:
1. Явно учитывай NULL'ы:
SQL:
SELECT * FROM users
WHERE status != 'active' OR status IS NULL;

2. Работай с COALESCE, если допустимо:
SQL:
SELECT * FROM users
WHERE COALESCE(status, '') != 'active';

То же касается и =: NULL = 'value' → UNKNOWN
Агрегации (COUNT, AVG`) тоже игнорируют `NULL — помни об этом при аналитике

Вывод:
NULL — не "ничего", а "неизвестно", и SQL строго это уважает. Не учитывая это, легко получить баг, который даже не заметишь сразу.
Всегда проверяй поведение WHERE, JOIN и агрегатов с NULL. Пиши явный код, особенно в проде.