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 упрощает проверку диапазона:
aBETWEENxANDy
эквивалентно
a>=xANDa<=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:
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для ненулевых входных данных IS DISTINCT FROM эквивалентен оператору <>. Однако, если оба входа являются null, он возвращает false, а если только один вход является null, то возвращает true. Аналогично, IS NOT DISTINCT FROM идентичен = для ненулевых входных данных, но возвращает true, когда оба входа являются null, и false, когда только один вход является null. Таким образом, эти предикаты действуют так, будто null является обычным значением данных, а не “неизвестным”.
Для проверки, является ли значение null или нет, используйте предикаты:
expressionIS NULLexpressionIS NOT NULL
или эквивалентные, но нестандартные предикаты:
expressionISNULLexpressionNOTNULL
Не пишите ,
потому что 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_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
Эти операторы всегда возвращают значение true или false, никогда не null, даже если операнд является null.
Null-значение входного параметра рассматривается как логическое значение "unknown".
Обратите внимание, что операторы IIS UNKNOWN и IS NOT UNKNOWN фактически эквивалентны операторам IS NULL и IS NOT NULL соответственно, за исключением того, что выражение входного параметра должно быть логического типа (boolean).
Некоторые функции, связанные с сравнением, также доступны, как показано в Таблица 9.3.
Таблица 9.3. Функции сравнения