Антипаттерн: NULL в WHERE — и ты в ловушке

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,447
Реакции
1,548
Credits
33,143
photo_2025-04-21_10-26-20.jpg
Антипаттерн: NULL в WHERE — и ты в ловушке

Когда в таблице есть NULL, а в WHERE ты пишешь что-то вроде:
SQL:
SELECT * FROM users WHERE age != 30;
Ты ожидаешь, что выберутся все, кто не 30.
Но если age IS NULL — такие строки пропадут из выборки!

Почему? Потому что NULL != 30 не TRUE, это UNKNOWN.
А SQL возвращает строки только там, где WHERE → TRUE.

Как избежать?
1. Будь явно осторожен с NULL:
SQL:
SELECT * FROM users
WHERE age != 30 OR age IS NULL;

2. Логика на уровне схемы:
– Если поле нужно всегда — делай NOT NULL.
– Если допускаешь NULL, продумывай поведение выборок.

3. Не верь глазам своим:
Даже count(*) и count(column) ведут себя по-разному из-за NULL.

Вывод:
NULL — это не ноль, не пустая строка и не "ничего".
Это "мы не знаем". И SQL ведёт себя с ним очень осторожно.