9.2. Функции и операторы сравнения#

9.2. Функции и операторы сравнения

9.2. Функции и операторы сравнения #

Доступны обычные операторы сравнения, как показано в Таблица 9.1.

Таблица 9.1. Операторы сравнения

ОператорОписание
datatype < datatypeboolean Less than
datatype > datatypeboolean Greater than
datatype <= datatypeboolean Less than or equal to
datatype >= datatypeboolean Greater than or equal to
datatype = datatypeboolean Equal
datatype <> datatypeboolean Not equal
datatype != datatypeboolean Not equal

Примечание

<> - это стандартная SQL-нотация для не равно. != - это псевдоним, который преобразуется в <> на очень раннем этапе разбора. Поэтому невозможно реализовать операторы != и <>, которые выполняют разные действия.

Эти операторы сравнения доступны для всех встроенных типов данных, которые имеют естественный порядок, включая числовые, строковые и типы даты/времени. Кроме того, массивы, составные типы и диапазоны могут быть сравнены, если их составные типы данных сравнимы.

Обычно возможно сравнивать значения связанных типов данных; например, integer > bigint будет работать. Некоторые случаи такого рода реализованы непосредственно с помощью операторов сравнения cross-type, но если такой оператор недоступен, парсер приведет менее общий тип к более общему типу и применит оператор сравнения последнего.

Как показано выше, все операторы сравнения являются бинарными операторами, которые возвращают значения типа boolean. Таким образом, выражения вроде 1 < 2 < 3 недопустимы (потому что нет оператора < для сравнения логического значения с 3). Используйте предикаты BETWEEN, показанные ниже, для выполнения диапазонных тестов.

Также существуют некоторые предикаты сравнения, как показано в Таблица 9.2. Они ведут себя почти так же, как операторы, но имеют специальный синтаксис, предписанный стандартом SQL.

Таблица 9.2. Предикаты сравнения

Предикат

Описание

Пример(ы)

datatype BETWEEN datatype AND datatypeboolean

Между (включая конечные точки диапазона).

2 МЕЖДУ 1 И 3t

2 МЕЖДУ 3 И 1f

datatype NOT BETWEEN datatype AND datatypeboolean

Не между (отрицание BETWEEN).

2 НЕ МЕЖДУ 1 И 3f

datatype BETWEEN SYMMETRIC datatype AND datatypeboolean

Между, после сортировки двух значений конечных точек.

2 МЕЖДУ СИММЕТРИЧНО 3 И 1t

datatype NOT BETWEEN SYMMETRIC datatype AND datatypeboolean

Не между, после сортировки двух значений конечных точек.

2 НЕ МЕЖДУ СИММЕТРИЧНО 3 И 1f

datatype IS DISTINCT FROM datatypeboolean

Не равно, считая null сравнимым значением.

1 НЕ РАВНО NULLt (вместо NULL)

NULL IS DISTINCT FROM NULLf (вместо NULL)

datatype IS NOT DISTINCT FROM datatypeboolean

Равно, считая NULL как сравнимое значение.

1 IS NOT DISTINCT FROM NULLf (вместо NULL)

NULL IS NOT DISTINCT FROM NULLt (вместо NULL)

datatype IS NULLboolean

Проверить, является ли значение пустым.

1.5 IS NULLf

datatype IS NOT NULLboolean

Проверить, является ли значение не пустым.

'null' IS NOT NULLt

datatype ISNULLboolean

Проверьте, является ли значение null (нестандартный синтаксис).

datatype NOTNULLboolean

Проверить, является ли значение не нулевым (нестандартный синтаксис).

boolean IS TRUEboolean

Проверить, дает ли логическое выражение истинное значение.

true IS TRUEt

NULL::boolean IS TRUEf (вместо NULL)

boolean IS NOT TRUEboolean

Проверяет, дает ли логическое выражение значение false или unknown.

true IS NOT TRUEf

NULL::boolean IS NOT TRUEt (вместо NULL)

boolean IS FALSEboolean

Проверяет, дает ли логическое выражение значение false.

true IS FALSEf

NULL::boolean IS FALSEf (вместо NULL)

boolean IS NOT FALSEboolean

Проверяет, дает ли логическое выражение значение true или unknown.

true IS NOT FALSEt

NULL::boolean IS NOT FALSEt (вместо NULL)

boolean IS UNKNOWNboolean

Проверяет, возвращает ли логическое выражение значение unknown.

true IS UNKNOWNf

NULL::boolean IS UNKNOWNt (вместо NULL)

boolean IS NOT UNKNOWNboolean

Проверяет, дает ли логическое выражение true или false.

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWNf (вместо 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

Для ненулевых входных данных IS DISTINCT FROM эквивалентен оператору <>. Однако, если оба входа являются null, он возвращает false, а если только один вход является null, то возвращает true. Аналогично, IS NOT DISTINCT FROM идентичен = для ненулевых входных данных, но возвращает true, когда оба входа являются null, и false, когда только один вход является null. Таким образом, эти предикаты действуют так, будто null является обычным значением данных, а не неизвестным.

Для проверки, является ли значение null или нет, используйте предикаты:

expression IS NULL
expression IS NOT NULL

или эквивалентные, но нестандартные предикаты:

expression ISNULL
expression NOTNULL

Не пишите expression = NULL, потому что NULL не равен NULL. (Значение null представляет неизвестное значение, и неизвестно, равны ли два неизвестных значения).

Подсказка

Некоторые приложения могут ожидать, что expression = NULL вернет true, если expression оценивается как 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 TRUE
boolean_expression IS NOT TRUE
boolean_expression IS FALSE
boolean_expression IS NOT FALSE
boolean_expression IS UNKNOWN
boolean_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. Функции сравнения

Функция

Описание

Пример(ы)

num_nonnulls ( VARIADIC "any" ) → integer

Возвращает количество ненулевых аргументов.

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

Возвращает количество нулевых аргументов.

num_nulls(1, NULL, 2)1