NULL и сравнения — почему = и <> с NULL не работают!
NULL в SQL — не значение, а его отсутствие. Из-за этого любые обычные сравнения с NULL ведут себя не так, как ожидают, и часто ломают фильтрацию.
Таблица:
users(id, email, deleted_at)Нужно выбрать неудалённых пользователей.
Типичный, но неправильный запрос:
SELECT *
FROM users
WHERE deleted_at = NULL;Запрос выполнится, но вернёт 0 строк.
Почему так — SQL выражение:
deleted_at = NULLникогда не бывает TRUE.
Любое сравнение с NULL (=, <>, <, >) возвращает UNKNOWN, а WHERE пропускает только TRUE.
То же самое с отрицанием:
WHERE deleted_at <> NULL;Результат — тоже пусто.
Правильный способ — IS NULL:
SELECT *
FROM users
WHERE deleted_at IS NULL;И обратное условие:
SELECT *
FROM users
WHERE deleted_at IS NOT NULL;IS NULL и IS NOT NULL — всегда возвращают TRUE или FALSE, никогда UNKNOWN.Частая скрытая ошибка в составных условиях:
WHERE status = 'active'
AND deleted_at <> '2026-01-01'Если
deleted_at равен NULL, всё выражение становится UNKNOWN, и строка отбрасывается, даже если status = 'active'.Корректная проверка «не удалён»:
WHERE status = 'active'
AND deleted_at IS NULLВажно помнить про OR:
WHERE role = 'admin'
OR deleted_at IS NULLЗдесь логика работает ожидаемо, потому что
IS NULL не возвращает UNKNOWN, а значит выражение может стать TRUE.Практические правила: = и <> с NULL не работают в
WHERE; любой UNKNOWN в WHERE — строка отбрасывается. Если строка пропала из результата — первым делом проверяй условия с NULL.SQL Ready | #практика
Просмотры: 606