Функции и операторы сравнения
Операторы сравнения
Среди операторов сравнения имеются обычные операторы, перечисленные ниже.
| Оператор | Описание |
|---|---|
| тип_данных < тип_данных → boolean | Меньше |
| тип_данных > тип_данных → boolean | Больше |
| тип_данных <= тип_данных → boolean | Меньше или равно |
| тип_данных >= тип_данных → boolean | Больше или равно |
| тип_данных = тип_данных → boolean | Равно |
| тип_данных <> тип_данных → boolean | Не равно |
| тип_данных != тип_данных → boolean | Не равно |
Примечание
Для условия «не равно» в стандарте SQL принята запись<>. Запись!=является псевдонимом, который преобразуется в<>на самом раннем этапе синтаксического анализа. Как следствие, реализовать операторы!=и<>так, чтобы они работали по-разному, невозможно.
Эти операторы сравнения доступны для всех встроенных типов данных с естественной сортировкой, включая числовые, строковые типы и типы даты/времени. Кроме того, сравниваться могут массивы, составные типы и диапазоны, если сравнимы типы данных их компонентов.
Обычно также можно сравнивать значения связанных типов данных; например, возможно
сравнение integer > bigint. Некоторые подобные операции реализуются
непосредственно «межтиповыми» операторами сравнения, но если такой оператор
отсутствует, синтаксический анализатор принудительно приведет менее распространенный
тип к более распространенному и применит подходящий для последнего оператор
сравнения.
Как показано выше, все операторы сравнения являются бинарными операторами, которые
возвращают значения типа boolean. Таким образом, выражения типа 1 < 2 < 3
недопустимы (потому что нет оператора < для сравнения логического значения с 3).
Для проверки принадлежности диапазону используйте предикат BETWEEN, описанный
ниже
Предикаты сравнения
Существует также несколько предикатов сравнения, перечисленных ниже. Они ведут себя подобно операторам, но имеют специальный синтаксис, предписанный стандартом SQL.
тип_данныхBETWEENтип_данныхANDтип_данных → boolean
Между (включая границы диапазона).
2 BETWEEN 1 AND 3 → t
2 BETWEEN 3 AND 1 → f
тип_данныхNOT BETWEENтип_данныхANDтип_данных → boolean
Не между (обратное к BETWEEN).
2 NOT BETWEEN 1 AND 3 → f
тип_данныхBETWEEN SYMMETRICтип_данныхANDтип_данных → boolean
Между, после сортировки двух граничных значений.
2 BETWEEN SYMMETRIC 3 AND 1 → t
тип_данныхNOT BETWEEN SYMMETRICтип_данныхANDтип_данных → boolean
Не между, после сортировки двух граничных значений.
2 NOT BETWEEN SYMMETRIC 3 AND 1 → f
тип_данныхIS DISTINCT FROMтип_данных → boolean
Не равно, при этом рассматривая NULL как сравнимое значение.
1 IS DISTINCT FROM NULL → t -- а не NULL
NULL IS DISTINCT FROM NULL → f -- а не NULL
тип_данныхIS NOT DISTINCT FROMтип_данных → boolean
Равно, при этом рассматривая NULL как сравнимое значение.
1 IS NOT DISTINCT FROM NULL → f -- а не NULL
NULL IS NOT DISTINCT FROM NULL → t -- а не NULL
тип_данных IS NULL → boolean
Проверка того, равно ли значение NULL.
1.5 IS NULL → f
тип_данных IS NOT NULL → boolean
Проверка того, отличается ли значение от NULL.
'null' IS NOT NULL → t
тип_данных ISNULL → boolean
Проверка того, равно ли значение NULL (нестандартный синтаксис).
тип_данных NOTNULL → boolean
Проверка того, отличается ли значение от NULL (нестандартный синтаксис).
boolean IS TRUE → boolean
Проверка того, является ли результат логического выражения значением true.
true IS TRUE → t
NULL::boolean IS TRUE → f -- а не NULL
boolean IS NOT TRUE → boolean
Проверка того, является ли результат логического выражения значением false или неизвестным.
true IS NOT TRUE → f
NULL::boolean IS NOT TRUE → t -- а не NULL
boolean IS FALSE → boolean
Проверка того, является ли результат логического выражения значением false.
true IS FALSE → f
NULL::boolean IS FALSE → f -- а не NULL
boolean IS NOT FALSE → boolean
Проверка того, является ли результат логического выражения значением true или неизвестным.
true IS NOT FALSE → t
NULL::boolean IS NOT FALSE → t -- а не NULL
boolean IS UNKNOWN → boolean
Проверка того, является ли результат логического выражения неизвестным значением.
true IS UNKNOWN → f
NULL::boolean IS UNKNOWN → t -- а не NULL
boolean IS NOT UNKNOWN → boolean
Проверка того, является ли результат логического выражения значением true или false.
true IS NOT UNKNOWN → t
NULL::boolean IS NOT UNKNOWN → f -- а не NULL
Примечания
Предикат BETWEEN упрощает проверки принадлежности диапазону:
a BETWEEN x AND y
равнозначно
a >= x AND a <= y
Обратите внимание, что BETWEEN обрабатывает граничные значения как включенные в диапазон. BETWEEN SYMMETRIC аналогичен BETWEEN за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, эти два аргумента автоматически меняются местами, поэтому всегда подразумевается непустой диапазон.
Различные варианты BETWEEN реализуются посредством обычных операторов сравнения, и поэтому они будут работать с любыми типами данных, которые можно сравнивать.
Примечание
Использование AND в синтаксисе BETWEEN создает неоднозначность с использованием AND как логического оператора. Для ее устранения в качестве второго аргумента предложения BETWEEN допускается только ограниченный набор типов выражений. Если вам нужно записать в BETWEEN более сложное подвыражение, заключите его в скобки.
Обычные операторы сравнения выдают NULL (что означает «неопределенность»), а
не true или false, когда любой из аргументов равен NULL. Например, 7 = NULL
возвращает NULL, как и 7 <> NULL. Когда это поведение не устраивает, можно
использовать предикаты IS [NOT] DISTINCT FROM:
a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b
Для входных значений не NULL условие IS DISTINCT FROM равнозначно оператору
<>. Однако если оба аргумента NULL, он возвращает false, а если только
один из аргументов NULL, он возвращает true. Аналогично условие IS NOT DISTINCT
FROM идентично = для аргументов не NULL, но возвращает true, если оба
аргумента NULL, и false, если только один аргумент NULL. Таким образом, эти
предикаты по сути ведут себя так, как если бы NULL был нормальным значением
данных, а не «неопределенным».
Чтобы проверить, является ли значение NULL, используются предикаты:
выражение IS NULL
выражение IS NOT NULL
или равнозначные, но нестандартные предикаты:
выражение ISNULL
выражение NOTNULL
Не пишите выражение = NULL, потому что NULL не «равно» NULL. (Значение
NULL представляет неопределенность, и неизвестно, равны ли два неопределенных
значения).
Совет
Некоторые приложения могут ожидать, чтовыражение = NULLвозвращает true, если результатом выражения является значение NULL. Настоятельно рекомендуется изменить эти приложения в соответствии со стандартом SQL. Однако если это невозможно, имеется переменная конфигурации transform_null_equals. Если она установлена, QHB преобразует предложения x = NULL в x IS NULL.
Если выражение имеет строковое значение, то IS NULL равно true, если само выражение строки NULL или когда все поля строки NULL, а IS NOT NULL равно true, если само выражение строки не NULL и все поля строки не NULL. Из-за этого поведения IS NULL и IS NOT NULL не всегда возвращают обратные результаты для таких выражений; в частности, строковое выражение, содержащее поля NULL и не NULL, вернет false для обеих проверок. В некоторых случаях может быть предпочтительнее записать строка 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 соответственно, за исключением того, что входное выражение должно иметь логический тип.
Функции сравнения
Также существует несколько связанных со сравнениями функций, перечисленных ниже.
num_nonnulls
num_nonnulls ( VARIADIC "any" ) → integer
Возвращает количество аргументов, отличных от NULL.
num_nonnulls(1, NULL, 2) → 2
num_nulls
num_nulls ( VARIADIC "any" ) → integer
Возвращает количество аргументов NULL.
num_nulls(1, NULL, 2) → 1