IS NULL, BETWEEN и IN
IS NULL
NULL — неизвестное/отсутствующее значение, а не ноль и не пустая строка.
WHERE shipped_at IS NULL
WHERE shipped_at IS NOT NULLshipped_at = NULL не работает: результат сравнения — UNKNOWN.
Для подстановки значения:
SELECT COALESCE(shipped_at, created_at)
FROM orders;BETWEEN
Границы включаются:
WHERE total BETWEEN 100 AND 500
-- эквивалентно total >= 100 AND total <= 500Для временных диапазонов безопаснее полуинтервал:
WHERE created_at >= TIMESTAMP '2026-07-01 00:00:00'
AND created_at < TIMESTAMP '2026-08-01 00:00:00'Так не приходится угадывать максимальную точность последней секунды дня или месяца.
IN
WHERE state IN ('NEW', 'PAID')Это компактная форма нескольких сравнений через OR.
NOT IN имеет ловушку:
WHERE id NOT IN (1, 2, NULL)Для остальных id одно сравнение с NULL дает UNKNOWN, и строка не проходит. Для подзапросов с потенциальным NULL обычно используют NOT EXISTS.
Трехзначная логика
| Выражение | Результат |
|---|---|
5 = 5 | TRUE |
5 = 7 | FALSE |
5 = NULL | UNKNOWN |
NULL IS NULL | TRUE |
WHERE оставляет только TRUE.
Связано: Условный оператор WHERE, Подзапросы с несколькими строками и одним столбцом, TIMESTAMP.
Вопросы
Включает ли BETWEEN границы? Да.
Почему даты лучше задавать полуинтервалом? Он не зависит от точности времени на верхней границе.
Чем опасен NOT IN с NULL? Предикат становится UNKNOWN вместо ожидаемого TRUE.
Как сравнить с NULL? Через IS NULL или IS NOT NULL.