9.2. Функции и операторы сравнения#
9.2. Функции и операторы сравнения #
Доступны обычные операторы сравнения, как показано в Таблица 9.1.
Таблица 9.1. Операторы сравнения
Оператор | Описание |
---|---|
datatype < datatype
→ boolean
| Less than |
datatype > datatype
→ boolean
| Greater than |
datatype <= datatype
→ boolean
| Less than or equal to |
datatype >= datatype
→ boolean
| Greater than or equal to |
datatype = datatype
→ boolean
| Equal |
datatype <> datatype
→ boolean
| Not equal |
datatype != datatype
→ boolean
| Not equal |
Примечание
<>
- это стандартная SQL-нотация для “не равно”. !=
- это псевдоним, который преобразуется в <>
на очень раннем этапе разбора. Поэтому невозможно реализовать операторы !=
и <>
, которые выполняют разные действия.
Эти операторы сравнения доступны для всех встроенных типов данных, которые имеют естественный порядок, включая числовые, строковые и типы даты/времени. Кроме того, массивы, составные типы и диапазоны могут быть сравнены, если их составные типы данных сравнимы.
Обычно возможно сравнивать значения связанных типов данных; например, integer
>
bigint
будет работать. Некоторые случаи такого рода реализованы непосредственно с помощью операторов сравнения “cross-type”, но если такой оператор недоступен, парсер приведет менее общий тип к более общему типу и применит оператор сравнения последнего.
Как показано выше, все операторы сравнения являются бинарными операторами, которые возвращают значения типа boolean
. Таким образом, выражения вроде 1 < 2 < 3
недопустимы (потому что нет оператора <
для сравнения логического значения с 3
). Используйте предикаты BETWEEN
, показанные ниже, для выполнения диапазонных тестов.
Также существуют некоторые предикаты сравнения, как показано в Таблица 9.2. Они ведут себя почти так же, как операторы, но имеют специальный синтаксис, предписанный стандартом SQL.
Таблица 9.2. Предикаты сравнения
Предикат Описание Пример(ы) |
---|
Между (включая конечные точки диапазона).
|
Не между (отрицание
|
Между, после сортировки двух значений конечных точек.
|
Не между, после сортировки двух значений конечных точек.
|
Не равно, считая null сравнимым значением.
|
Равно, считая NULL как сравнимое значение.
|
Проверить, является ли значение пустым.
|
Проверить, является ли значение не пустым.
|
Проверьте, является ли значение null (нестандартный синтаксис). |
Проверить, является ли значение не нулевым (нестандартный синтаксис). |
Проверить, дает ли логическое выражение истинное значение.
|
Проверяет, дает ли логическое выражение значение false или unknown.
|
Проверяет, дает ли логическое выражение значение false.
|
Проверяет, дает ли логическое выражение значение true или unknown.
|
Проверяет, возвращает ли логическое выражение значение unknown.
|
Проверяет, дает ли логическое выражение true или false.
|
Предикат BETWEEN
упрощает проверку диапазона:
a
BETWEENx
ANDy
эквивалентно
a
>=x
ANDa
<=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 FROMb
a
IS NOT DISTINCT FROMb
Для ненулевых входных данных IS DISTINCT FROM
эквивалентен оператору <>
. Однако, если оба входа являются null, он возвращает false, а если только один вход является null, то возвращает true. Аналогично, IS NOT DISTINCT FROM
идентичен =
для ненулевых входных данных, но возвращает true, когда оба входа являются null, и false, когда только один вход является null. Таким образом, эти предикаты действуют так, будто null является обычным значением данных, а не “неизвестным”.
Для проверки, является ли значение null или нет, используйте предикаты:
expression
IS NULLexpression
IS NOT NULL
или эквивалентные, но нестандартные предикаты:
expression
ISNULLexpression
NOTNULL
Не пишите
,
потому что expression
= NULLNULL
не “равен”
NULL
. (Значение null представляет неизвестное значение,
и неизвестно, равны ли два неизвестных значения).
Подсказка
Некоторые приложения могут ожидать, что
вернет true, если expression
= NULLexpression
оценивается как null. Настоятельно рекомендуется изменить эти приложения, чтобы они соответствовали стандарту SQL. Однако, если это невозможно, доступна конфигурационная переменная transform_null_equals. Если она включена, Tantor BE будет преобразовывать предложения x = NULL
в x IS NULL
.
Если expression
имеет значение строки, то
IS NULL
истинно, когда само выражение строки является нулевым
или когда все поля строки являются нулевыми, в то время как
IS NOT NULL
истинно, когда само выражение строки не является нулевым
и все поля строки не являются нулевыми. Из-за такого поведения
IS NULL
и IS NOT NULL
не всегда возвращают
обратные результаты для выражений со значениями строк; в частности, выражение со значениями строк,
которое содержит как нулевые, так и ненулевые поля, вернет false
для обоих тестов. В некоторых случаях может быть предпочтительнее
использовать row
IS DISTINCT FROM NULL
или row
IS NOT DISTINCT FROM NULL
,
которые просто проверяют, является ли общее значение строки нулевым без дополнительных
тестов на поля строки.
Логические значения также могут быть проверены с использованием предикатов
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_expression
IS NOT UNKNOWN
Эти операторы всегда возвращают значение true или false, никогда не null, даже если операнд является null.
Null-значение входного параметра рассматривается как логическое значение "unknown".
Обратите внимание, что операторы IIS UNKNOWN
и IS NOT UNKNOWN
фактически эквивалентны операторам IS NULL
и IS NOT NULL
соответственно, за исключением того, что выражение входного параметра должно быть логического типа (boolean).
Некоторые функции, связанные с сравнением, также доступны, как показано в Таблица 9.3.
Таблица 9.3. Функции сравнения