9.2. Функции и операторы сравнения

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

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

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

Примечание

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

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

Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.

Таблица 9.2. Предикаты сравнения

ПредикатОписание
aBETWEENxANDyмежду
aNOT BETWEENxANDyне между
aBETWEEN SYMMETRICxANDyмежду, после сортировки сравниваемых значений
aNOT BETWEEN SYMMETRICxANDyне между, после сортировки сравниваемых значений
aIS DISTINCT FROMbне равно, при этом NULL воспринимается как обычное значение
aIS NOT DISTINCT FROMbравно, при этом NULL воспринимается как обычное значение
выражениеIS NULLэквивалентно NULL
выражениеIS NOT NULLне эквивалентно NULL
выражениеISNULLэквивалентно NULL (нестандартный синтаксис)
выражениеNOTNULLне эквивалентно NULL (нестандартный синтаксис)
логическое_выражениеIS TRUEистина
логическое_выражениеIS NOT TRUEложь или неопределённость
логическое_выражениеIS FALSEложь
логическое_выражениеIS NOT FALSEистина или неопределённость
логическое_выражениеIS UNKNOWNнеопределённость
логическое_выражениеIS NOT UNKNOWNистина или ложь

Предикат 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 (что означает «неопределённость»), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL. Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM:

a IS DISTINCT FROM ba IS NOT DISTINCT FROM b

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

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

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

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

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

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

Подсказка

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

Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строкаIS DISTINCT FROM NULL или строкаIS NOT DISTINCT FROM NULL, чтобы просто проверить, равно ли 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, соответственно, за исключением того, что выражение может быть только булевого типа.

Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.

Таблица 9.3. Функции сравнения

ФункцияОписаниеПримерРезультат примера
num_nonnulls(VARIADIC "any")возвращает число аргументов, отличных от NULLnum_nonnulls(1, NULL, 2)2
num_nulls(VARIADIC "any")возвращает число аргументов NULLnum_nulls(1, NULL, 2)1

close