9.18. Условные выражения#
9.18. Условные выражения #
Этот раздел описывает условные выражения, совместимые с SQL, доступные в Tantor BE.
Подсказка
Если ваши задачи выходят за рамки возможностей этих условных выражений, вам может понадобиться написать функцию на стороне сервера на более выразительном языке программирования.
Примечание
Хотя COALESCE
, GREATEST
и LEAST
синтаксически похожи на функции, они не являются обычными функциями и, следовательно, не могут использоваться с явными аргументами массива VARIADIC
.
9.18.1. CASE
#
Выражение SQL CASE
является обобщенным условным выражением, аналогичным операторам if/else в других языках программирования:
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] END
Предложения CASE
могут использоваться везде, где допустимо выражение. Каждое condition
является выражением, которое возвращает результат типа boolean
. Если результат условия истинный, значение выражения CASE
будет result
, следующим за условием, и остаток выражения CASE
не обрабатывается. Если результат условия ложный, последующие предложения WHEN
обрабатываются аналогичным образом. Если ни одно из условий condition
WHEN
не является true, значение выражения CASE
будет result
предложения ELSE
. Если предложение ELSE
не указано и ни одно условие не является true, результат будет null.
Пример:
SELECT * FROM test; a --- 1 2 3 SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case ---+------- 1 | one 2 | two 3 | other
Типы данных всех выражений result
должны преобразовываться в один выходной тип.
См. Раздел 10.5 для получения дополнительной информации.
Существует “простая” форма выражения CASE
, которая является вариантом общей формы, описанной выше:
CASEexpression
WHENvalue
THENresult
[WHEN ...] [ELSEresult
] END
Первое выражение expression
, затем сравнивается с каждым из выражений value
в предложениях WHEN
, пока не будет найдено такое, которое равно ему. Если совпадение не найдено, возвращается result
предложения ELSE
(или значение null). Это аналогично оператору switch
в языке C.
Пример выше можно записать с использованием простого синтаксиса CASE
:
SELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM test; a | case ---+------- 1 | one 2 | two 3 | other
Выражение CASE
не вычисляет подвыражения, которые необходимы для определения результата. Например, это возможный способ избежать ошибки деления на ноль:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Примечание
Как описано в Раздел 4.2.14, существуют различные ситуации, в которых подвыражения выражения вычисляются в разное время, так что принцип, что “CASE
вычисляет только необходимые подвыражения”, не является абсолютным. Например, постоянное подвыражение 1/0
обычно приведет к ошибке деления на ноль на этапе планирования, даже если оно находится в ветви CASE
, которая никогда не будет выполнена во время выполнения.
9.18.2. COALESCE
#
COALESCE
(value
[, ...])
Функция COALESCE
возвращает первый из своих аргументов, который не является null. Null возвращается только в том случае, если все аргументы являются null. Она часто используется для замены значения по умолчанию для null значений при извлечении данных для отображения, например:
SELECT COALESCE(description, short_description, '(none)') ...
Это возвращает description
, если оно не является пустым, в противном случае
short_description
, если оно не является пустым, в противном случае (none)
.
Все аргументы должны быть преобразовываться в общий тип данных, который будет типом результата (см. Раздел 10.5 для получения подробной информации).
Как и выражение CASE
, функция COALESCE
вычисляет только аргументы, необходимые для определения результата; то есть аргументы справа от первого ненулевого аргумента не вычисляются. Эта функция, соответствующая стандарту SQL, предоставляет возможности, аналогичные функциям NVL
и IFNULL
, используемым в некоторых других системах баз данных.
9.18.3. NULLIF
#
NULLIF
(value1
,value2
)
Функция NULLIF
возвращает значение null, если
value1
равно value2
;
в противном случае она возвращает value1
.
Это может быть использовано для выполнения обратной операции
примера COALESCE
, приведенного выше:
SELECT NULLIF(value, '(none)') ...
В этом примере, если value
равно (none)
,
возвращается значение null, в противном случае возвращается значение value
.
Два аргумента должны быть сравнимыми типами.
Более конкретно, они сравниваются точно так же, как если бы вы написали
, поэтому должен быть доступен подходящий оператор value1
= value2
=
.
Результат имеет тот же тип, что и первый аргумент - но есть нюанс. Фактически возвращается первый аргумент подразумеваемого оператора =
, и в некоторых случаях он будет преобразован для соответствия типу второго аргумента. Например, NULLIF(1, 2.2)
дает numeric
, потому что нет оператора integer
=
numeric
, только numeric
=
numeric
.
9.18.4. GREATEST
и LEAST
#
GREATEST
(value
[, ...])
LEAST
(value
[, ...])
GREATEST
и LEAST
функции выбирают
наибольшее или наименьшее значение из списка любого количества выражений.
Все выражения должны быть преобразуемы к общему типу данных, который
будет типом результата
(см. Раздел 10.5 для подробностей).
Значения NULL в списке аргументов игнорируются. Результат будет NULL только если все выражения оцениваются как NULL. (Это отклонение от стандарта SQL. Согласно стандарту, возвращаемое значение является NULL, если любой аргумент является NULL. Некоторые другие базы данных ведут себя таким образом.)