TGViewer
SQL Ready | Базы Данных SQL Ready | Базы Данных @sql_ready · 17.5K subscribers
Post #1716 2.98K
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 | #практика
  • 🔥 17
  • ❤ 12
  • 👍 11
  • 🤝 1
More from @sql_ready
  1. Oct 7, 2026📂 Шпаргалка по паттернам распределённых систем! Например, Replication повышает доступност…
  2. Oct 6, 2026Проверяйте связи с учётом периода! В PostgreSQL 18 связь может учитывать ещё и период его…
  3. Oct 6, 2026⚡️5 фундаментальных курсов по ИБ по цене одного Это предложение для тех, кто готов войти в…
  4. Oct 6, 2026👍 Устройство PostgreSQL — подробная документация на русском языке! Материалы посвящены не…
  5. Oct 5, 2026COUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения! В PostgreSQL точный CO…
  6. Oct 5, 2026Как оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться б…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →