IS NULL, BETWEEN и IN

IS NULL

NULL — неизвестное/отсутствующее значение, а не ноль и не пустая строка.

WHERE shipped_at IS NULL
WHERE shipped_at IS NOT NULL

shipped_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 = 5TRUE
5 = 7FALSE
5 = NULLUNKNOWN
NULL IS NULLTRUE

WHERE оставляет только TRUE.

Связано: Условный оператор WHERE, Подзапросы с несколькими строками и одним столбцом, TIMESTAMP.

Вопросы

Включает ли BETWEEN границы? Да.

Почему даты лучше задавать полуинтервалом? Он не зависит от точности времени на верхней границе.

Чем опасен NOT IN с NULL? Предикат становится UNKNOWN вместо ожидаемого TRUE.

Как сравнить с NULL? Через IS NULL или IS NOT NULL.