9.18. Условные выражения#

9.18. Условные выражения

9.18. Условные выражения

Этот раздел описывает условные выражения, совместимые с SQL, доступные в Tantor SE.

Подсказка

Если ваши задачи выходят за рамки возможностей этих условных выражений, вам может понадобиться написать функцию на стороне сервера на более выразительном языке программирования.

Примечание

Хотя COALESCE, GREATEST и LEAST синтаксически похожи на функции, они не являются обычными функциями и, следовательно, не могут использоваться с явными аргументами массива VARIADIC.

9.18.1. CASE

Выражение SQL CASE является обобщенным условным выражением, аналогичным операторам if/else в других языках программирования:

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
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, которая является вариантом общей формы, описанной выше:

CASE expression
    WHEN value THEN result
    [WHEN ...]
    [ELSE result]
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.

Обратите внимание, что функции GREATEST и LEAST не являются частью стандарта SQL, но являются распространенным расширением. Некоторые другие базы данных возвращают значение NULL, если хотя бы один из аргументов является NULL, вместо того чтобы возвращать NULL только в случае, если все аргументы являются NULL.