9.2. Операторы сравнения
Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.
Таблица 9.1. Операторы сравнения
Оператор | Описание |
---|---|
< | меньше |
> | больше |
<= | меньше или равно |
>= | больше или равно |
= | равно |
<> или != | не равно |
Примечание
Оператор !=
преобразуется в <>
на стадии разбора запроса. Как следствие, реализовать операторы !=
и <>
по-разному невозможно.
Операторы сравнения определены для всех типов данных, для которых они имеют смысл. Все операторы сравнения представляют собой бинарные операторы, возвращающие значения типа boolean
; при этом выражения вида 1 < 2 < 3
недопустимы (так как не существует оператора <
, который бы сравнивал булево значение с 3
).
Операторы сравнения дополняет специальная конструкция BETWEEN
:
a
BETWEENx
ANDy
равнозначно выражению
a
>=x
ANDa
<=y
Заметьте, что BETWEEN
считает, что границы интервала также включаются в интервал. NOT BETWEEN
выполняет противоположное сравнение:
a
NOT BETWEENx
ANDy
равнозначно выражению
a
<x
ORa
>y
Конструкция BETWEEN SYMMETRIC
аналогична BETWEEN
, за исключением того, что аргумент слева от AND
не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, то есть интервал всегда будет не пустым.
Обычные операторы сравнения выдают NULL (что означает «неопределённость»), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL
выдаёт NULL, так же, как и 7 <> NULL
. Когда это поведение нежелательно, можно использовать конструкции IS [ NOT ] DISTINCT FROM
:
a
IS DISTINCT FROMb
a
IS NOT DISTINCT FROMb
Для значений не 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
Заметьте, что проверка
не будет работать, так как выражение
= NULLNULL
считается не «равным» NULL
. (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.)
Подсказка
Некоторые приложения могут ожидать, что
вернёт true, если результатом выражение
= NULLвыражения
является 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
, соответственно, за исключением того, что выражение может быть только булевого типа.