9.2. Операторы сравнения

Набор операторов сравнения включает обычные операторы, перечисленные в таблице Таблице 9-1.

Таблица 9-1. Операторы сравнения

ОператорОписание
<меньше
>больше
<=меньше или равно
>=больше или равно
=равно
<> или !=не равно

Замечание: Оператор != преобразуется в <> на стадии разбора запроса. Как следствие, реализовать операторы != и <> по-разному невозможно.

Операторы сравнения определены для всех типов данных, для которых они имеют смысл. Все операторы сравнения представляют собой бинарные операторы, возвращающие значения типа boolean; при этом выражения вида 1 < 2 < 3 недопустимы (так как не существует оператора <, который бы сравнивал булево значение с 3).

Операторы сравнения дополняет специальная конструкция BETWEEN:

a BETWEEN x AND y

равнозначно выражению

a >= x AND a <= y

Заметьте, что BETWEEN считает, что границы интервала также включаются в интервал. NOT BETWEEN выполняет противоположное сравнение:

a NOT BETWEEN x AND y

равнозначно выражению

a < x OR a > y

Конструкция BETWEEN SYMMETRIC аналогична BETWEEN, за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, то есть интервал всегда будет не пустым.

Для проверки, содержит ли значение NULL или нет, используются конструкции:

выражение IS NULL
выражение IS NOT NULL

или равнозначные (но нестандартные) конструкции:

выражение ISNULL
выражение NOTNULL

Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается "не равным" NULL. (Значение NULL представляет неопределённость и равны ли две неопределённости, тоже не определено.) Это поведение полностью соответствует стандарту SQL.

Подсказка: Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако, в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL.

Замечание: Если выражение возвращает табличную строку, тогда условие IS NULL будет истинным, когда само выражение равно NULL или все поля строки равны NULL, а IS NOT NULL будет истинным, когда выражение не равно NULL и все поля строки также не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений, так как для строк, одни поля которых NULL, а другие не NULL, оба условия будут ложными. Это поведение соответствует стандарту SQL и отличается от того, как это было реализовано в PostgreSQL до версии 8.2.

Обычные операторы сравнения выдают NULL (что означает "неопределённость"), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL. Когда это поведение нежелательно, можно использовать конструкции IS [ NOT ] DISTINCT FROM:

выражение IS DISTINCT FROM выражение
выражение IS NOT DISTINCT FROM выражение

Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <>. Однако, если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL и false в противном случае. Таким образом, эти конструкции по сути работают с NULL, как с обычным значением, а не с "неопределённостью".

Логические значения можно также проверить с помощью условий

выражение IS TRUE
выражение IS NOT TRUE
выражение IS FALSE
выражение IS NOT FALSE
выражение IS UNKNOWN
выражение IS NOT UNKNOWN

Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд NULL. Они интерпретируют значение NULL как "неизвестное" логическое состояние. Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL, соответственно, за исключением того, что выражение может быть только булевого типа.