В данном разделе описываются соответствующие стандарту SQL SQLусловные выражения, доступные в Digital Q.DataBase.
Если текущие задачи выходят за рамки возможностей данных условных выражений, рекомендуется рассмотреть разработку серверной функции на более выразительном языке программирования.
Хотя COALESCE, GREATEST, а
LEAST синтаксически подобны функциям, они не являются обычными функциями и, следовательно, не могут быть использованы с явными
VARIADIC аргументами-массивами.
CASE #
Функции, SQL CASE выражение представляет собой универсальное условное выражение, аналогичное конструкциям if/else в других языках программирования:
CASE WHENусловиеTHENрезультат[WHEN ...] [ELSEрезультат] END
CASE предложения могут использоваться в любом месте, где допускается выражение. Каждое условие представляет собой выражение, возвращающее boolean результат. Если результатом условия является значение true, то значение CASE выражения является
результат , следующая за данным условием, а оставшаяся часть CASE выражения не обрабатывается. Если результат условия не является истинным, любые последующие WHEN предложения
анализируются аналогичным образом. Если ни одно из них WHEN
условие не истинно, то значением
CASE всего выражения будет значение результат из
ELSE предложения. Если же ELSE предложение ELSE опущено и ни одно из условий не выполняется, результатом будет значение 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
Типы данных всех результирующих результат
выражений должны быть приводимы к общему типу вывода.
Подробнее см. Раздел 2.7.5 в соответствующем разделе.
Существует «простая» форма CASE выражения,
представляющего собой вариант приведенной выше общей формы:
CASEвыражениеWHENvalueTHENрезультат[WHEN ...] [ELSEрезультат] END
Первое значение
выражение вычисляется, после чего оно сравнивается с
каждым из value выражений в
WHEN предложениях до тех пор, пока не будет найдено равное ему значение. Если
совпадение не найдено, возвращается результат из
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;
Как описано в Раздел 2.1.2.14, существуют различные
ситуации, при которых подвыражения некоторого выражения вычисляются в
разное время, вследствие чего принцип, согласно которому «CASE
вычисляются только необходимые подвыражения» не является абсолютным. Например,
константное 1/0 подвыражение обычно приводит к возникновению ошибки деления на ноль на этапе планирования, даже если оно находится внутри CASE ветви, которая никогда не была бы выполнена во время выполнения.
COALESCE #COALESCE(value[, ...])
Функции, COALESCE функция возвращает первый из своих
аргументов, имеющий значение, отличное от null. Значение null возвращается только в том случае, если все аргументы
имеют значение null. Данная функция часто используется для замены значений null значениями по умолчанию при выборке данных для отображения, например:
SELECT COALESCE(description, short_description, '(none)') ...
Данная функция возвращает описание если оно не имеет значение NULL; в противном случае возвращается
short_description если оно не имеет значение NULL; в противном случае возвращается (нет).
Все аргументы должны быть приводимы к общему типу данных, который станет типом результата (подробнее см. Раздел 2.7.5 for details).
Подобно CASE выражению, COALESCE вычисляются
только те аргументы, которые необходимы для определения результата;
то есть аргументы, расположенные справа от первого аргумента, отличного от NULL,
не вычисляются. Данная функция стандарта SQL предоставляет возможности, аналогичные функциям NVL и IFNULL, которые используются в некоторых других системах баз данных.
NULLIF #NULLIF(значение1,значение2)
Функции, NULLIF функция возвращает значение NULL, если
значение1 равно значение2;
в противном случае она возвращает значение1.
Данную конструкцию можно использовать для выполнения операции, обратной
COALESCE примеру, приведенному выше:
SELECT NULLIF(value, '(none)') ...
В данном примере, если значение является (нет),
возвращается значение NULL, в противном случае возвращается значение значение
возвращается.
Оба аргумента должны иметь сравнимые типы. Более конкретно, они сравниваются точно так же, как если бы вы написали , поэтому должен быть доступен
соответствующий значение1
= значение2= оператор.
Результат имеет тот же тип данных, что и первый аргумент — но здесь есть
определенный нюанс. Фактически возвращаемое значение представляет собой первый аргумент неявного = оператора, который в некоторых случаях может быть приведен к типу второго аргумента. Например, вызов функции NULLIF(1, 2.2) возвращает numeric,
поскольку отсутствует оператор integer =
numeric оператор,
только numeric = numeric.
GREATEST и LEAST #GREATEST(value[, ...])
LEAST(value[, ...])
Данный GREATEST и LEAST функции выбирают наибольшее или наименьшее значение из списка произвольного количества выражений. Все выражения должны быть приводимы к общему типу данных, который и станет типом результата (см. Раздел 2.7.5 for details).
Значения NULL в списке аргументов игнорируются. Результат будет иметь значение NULL только в том случае, если все выражения принимают значение NULL. (Это является отклонением от требований стандарта SQL. Согласно стандарту SQL, возвращаемое значение должно быть NULL, если хотя бы один аргумент имеет значение NULL. Некоторые другие системы управления базами данных работают именно так.)