Доступны стандартные операторы сравнения, приведенные в Таблица 2.6.1.
Таблица 2.6.1. Операторы сравнения
| Оператор | Описание |
|---|---|
тип данных < тип данных
→ boolean
| Меньше |
тип данных > тип данных
→ boolean
| Больше |
тип данных <= тип данных
→ boolean
| Меньше или равно |
тип данных >= тип данных
→ boolean
| Больше или равно |
тип данных = тип данных
→ boolean
| Равно |
тип данных <> тип данных
→ boolean
| Не равно |
тип данных != тип данных
→ boolean
| Не равно |
<> представляет собой стандартную нотацию языка SQL для «не
равно». != является псевдонимом, который преобразуется
в <> на самом раннем этапе синтаксического анализа.
Следовательно, реализация !=
и <> как операторы, выполняющие различные действия, невозможна.
Данные операторы сравнения доступны для всех встроенных типов данных, обладающих естественным порядком сортировки, включая числовые и строковые типы, а также типы даты/времени. Кроме того, можно сравнивать массивы, составные типы и диапазоны, если сопоставимы их составляющие типы данных.
Обычно также допускается сравнение значений связанных типов данных; например, integer >
bigint будет работать. Некоторые подобные случаи реализуются
непосредственно при помощи «межтиповых» операторов сравнения, однако при отсутствии такого оператора синтаксический анализатор выполнит приведение менее общего типа к более общему и применит оператор сравнения последнего.
Как показано выше, все операторы сравнения являются бинарными операторами, возвращающими значения типа boolean. Таким образом, выражения вида
1 < 2 < 3 не являются допустимыми (поскольку отсутствует < оператор для сравнения логического значения с
3). Используйте BETWEEN предикаты,
приведенные ниже, для выполнения проверки на вхождение в диапазон.
Существует также ряд предикатов сравнения, как показано в Таблица 2.6.2. По своему действию они подобны операторам, но имеют специальный синтаксис, определенный стандартом SQL.
Таблица 2.6.2. Предикаты сравнения
Предикат Описание Примеры |
|---|
Нахождение в диапазоне (включая его границы).
|
Оператор NOT BETWEEN (отрицание
|
Проверка вхождения в диапазон после сортировки двух граничных значений.
|
Проверка невхождения в диапазон после сортировки двух граничных значений.
|
Проверка на неравенство, при которой значение NULL рассматривается как сопоставимое.
|
Проверка на равенство, при которой значение NULL рассматривается как сопоставимое.
|
Проверка того, является ли значение неопределенным (NULL).
|
Проверка того, что значение не является неопределенным (NULL).
|
Проверка того, является ли значение неопределенным (нестандартный синтаксис). |
Проверка того, что значение не является неопределенным (нестандартный синтаксис). |
Проверка того, возвращает ли логическое выражение значение true.
|
Проверка того, возвращает ли логическое выражение значение false или unknown.
|
Проверка того, возвращает ли логическое выражение значение false.
|
Проверка того, возвращает ли логическое выражение значение true или unknown.
|
Проверка того, возвращает ли логическое выражение значение unknown.
|
Проверка того, возвращает ли логическое выражение значение true или false.
|
Данный BETWEEN предикат упрощает проверку попадания в диапазон:
aBETWEENxANDy
эквивалентно
a>=xANDa<=y
Обратите внимание на то, что BETWEEN рассматривает граничные значения как включенные в диапазон.
BETWEEN SYMMETRIC аналогичен BETWEEN
за исключением того, что отсутствует требование, чтобы аргумент слева от
AND был меньше или равен аргументу справа. Если это условие не выполняется, данные аргументы автоматически меняются местами, так что в итоге всегда подразумевается непустой диапазон.
Различные варианты оператора BETWEEN реализованы на основе обычных операторов сравнения и, следовательно, применимы к любым типам данных, поддерживающим сравнение.
Использование оператора AND в синтаксисе BETWEEN
создает неоднозначность с использованием AND в качестве
логического оператора. Для разрешения этой неоднозначности в качестве второго аргумента предложения BETWEEN
допускается только ограниченный набор типов выражений. Если требуется указать более сложное подвыражение
в BETWEEN, данное подвыражение следует заключить в круглые скобки.
Обычные операторы сравнения возвращают значение null (означающее «unknown»),
а не true или false, если какой-либо из входных операндов равен null. Например,
7 = NULL возвращает null, так же как и выражение 7 <> NULL. Когда
такое поведение неприемлемо, следует использовать
IS [ NOT ] DISTINCT FROM предикаты:
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для операндов, не являющихся значениями null, IS DISTINCT FROM действует
так же, как и <> оператор. Однако если оба операнда имеют значение null, он возвращает false, а если значение null имеет только один операнд — true. Аналогично, предикат IS NOT DISTINCT
FROM идентичен оператору = для входных данных, отличных от NULL, однако он возвращает истину (true), когда оба входных значения имеют значение NULL, и ложь (false), если только одно из значений является NULL. Таким образом, данные предикаты функционируют так, как если бы значение NULL было обычным значением данных, а не «unknown».
Для проверки того, является ли значение пустым (NULL) или нет, используются следующие предикаты:
выражениеоператор IS NULLвыражениеоператор IS NOT NULL
или эквивалентные, но не соответствующие стандарту предикаты:
выражениеISNULLвыражениеNOTNULL
Не не пишите
поскольку выражение = NULLNULL не является «равным»
NULL. (Значение null представляет собой неизвестное значение, и неизвестно, равны ли два таких значения между собой.)
Для некоторых приложений может ожидаться, что
возвращает true, если выражение = NULLвыражение результатом выражения является значение 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 не всегда возвращают
противоположные результаты для выражений со значениями типа «строка» (row-valued expressions); в частности, выражение со значением типа «строка», содержащее как поля NULL, так и поля с отличными от NULL значениями, вернет значение false для обеих проверок. Например:
SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); SELECT ROW(table.*) IS NULL FROM table; -- обнаружение строк, полностью состоящих из значений NULL SELECT ROW(table.*) IS NOT NULL FROM table; -- обнаружение строк, не содержащих ни одного значения NULL SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- обнаружение строк, содержащих хотя бы одно значение NULL
В некоторых случаях может быть предпочтительнее записывать выражение ROW IS DISTINCT FROM NULL
или выражение ROW IS NOT DISTINCT FROM NULL, который позволяет просто проверить, является ли значение всей строки в целом значением NULL, без проведения дополнительных проверок отдельных полей этой строки.
Логические значения также можно проверять с помощью предикатов
boolean_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
Данные предикаты всегда возвращают логическое значение true или false и никогда не возвращают null, даже если операнд имеет значение null. Входное значение null в таких случаях обрабатывается как логическое значение «unknown».
Обратите внимание, что IS UNKNOWN и IS NOT UNKNOWN фактически
эквивалентны оператор IS NULL и
оператор IS NOT NULL, соответственно, за исключением того, что входное выражение должно иметь тип Boolean.
Также доступны некоторые функции сравнения, представленные в Таблица 2.6.3.
Таблица 2.6.3. Функции сравнения