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

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

Доступны обычные операторы сравнения, которые показаны в Table 9-1.

Table 9-1. Операторы сравнения

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

Note: Оператор != на этапе синтаксического разбора преобразуется в <>. Не представляется возможным реализовать разную функциональность у операторов != и <>.

Операторы сравнения доступны для всех соответствующих типов данных. Все операторы сравнения являются бинарными операторами, которые возвращают значения типа boolean; такие выражения как 1 < 2 < 3 не допустимы (потому что не существует оператора < для сравнения логического значения типа boolean с числом 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 или не-NULL, используются конструкты:

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

или эквивалентные им, но нестандартные конструкты:

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

Не пишите expression = NULL, потому что NULL не "равен" NULL. (Значение NULL считается неизвестной величиной, а два неизвестных значения не могут быть равны). Это соответствует стандарту SQL.

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

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

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

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

Если сравниваемые значение не-NULL, конструкт IS DISTINCT FROM выполняется точно также как и оператор <>. Однако, если оба сравниваемых значения являются NULL, он возвращает ложь, а если NULL является только одним из сравниваемых значений, он возвращает истину. Похожим образом, конструкт IS NOT DISTINCT FROM идентичнен оператору = если оба сравниваемых значения не-NULL, но он возвращает истину, если оба сравниваемых значения являются NULL и ложь, если только одно из этих значений NULL. Таким образом, эти конструкты эффективно выполняют работают с NULL как с обычными данными, а не как со значением "неизвестно".

Значения типа boolean могут также сравниваться с помощью конструктов:

expression IS TRUE
expression IS NOT TRUE
expression IS FALSE
expression IS NOT FALSE
expression IS UNKNOWN
expression IS NOT UNKNOWN

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

Back to top

(С) Виктор Вислобоков, 2008-2023