Условные выражения#
CASE#
Возвращает один из нескольких результатов.
Выражение SQL CASE
имеет две формы. Обе формы обрабатывают выражения
WHEN
слева направо. При нахождении первого совпадения будет возвращен
соответствующий result
. Если совпадений не найдено, будет возвращен
результат выражения ELSE
. Если совпадений не найдено, а ELSE
не
задан, будет возвращен NULL
.
Форма «simple» сравнивает expression
с value
в ветках WHEN
:
CASE expression
WHEN value THEN result
[ WHEN ... ]
[ ELSE result ]
END
Пример:
SELECT a,
CASE a
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'many'
END
Форма «searched» вычисляет логические выражения в ветках WHEN
:
CASE
WHEN condition THEN result
[ WHEN ... ]
[ ELSE result ]
END
Пример:
SELECT a, b,
CASE
WHEN a = 1 THEN 'aaa'
WHEN b = 2 THEN 'bbb'
ELSE 'ccc'
END
Следующее выражение в simple форме:
SELECT a,
CASE a
WHEN 1 THEN 'one'
WHEN 2 THEN 'two'
ELSE 'many'
END
эквивалентно:
SELECT a,
CASE
WHEN a = 1 THEN 'one'
WHEN a = 2 THEN 'two'
ELSE 'many'
END
SQL routines могут использовать выражения CASE
с другим синтаксисом:
условия должны оканчиваться на ;
, а в конце выражения необходимо написать END CASE
.
IF#
Выражение IF
имеет две формы.
- if(condition, true_value)#
Вычисляет и возвращает
true_value
, еслиcondition
равноTRUE
. В противном случае возвращаетNULL
.
- if(condition, true_value, false_value)
Вычисляет и возвращает
true_value
, еслиcondition
равноTRUE
. В противном вычисляет и возвращаетfalse_value
.
Следующие выражения IF
и CASE
эквивалентны:
SELECT
orderkey,
totalprice,
IF(totalprice >= 150000, 'High Value', 'Low Value')
FROM tpch.sf1.orders;
SELECT
orderkey,
totalprice,
CASE
WHEN totalprice >= 150000 THEN 'High Value'
ELSE 'Low Value'
END
FROM tpch.sf1.orders;
SQL routines могут использовать выражения IF
с другим синтаксисом:
каждое выражения должно оканчиваться на ;
, а в конце выражения необходимо написать END IF
.
COALESCE#
- coalesce(value1, value2[, ...])#
Возвращает первое
value
в списке аргументов, значение которого не равноNULL
.
NULLIF#
- nullif(value1, value2)#
Возвращает
NULL
, еслиvalue1
равноvalue2
, в противном случае возвращаетvalue1
.
TRY#
- try(expression)#
Возвращает значение
expression
в случае его успешного вычисления илиNULL
в случае ошибки.
Функция try
полезна, когда предпочтительно, чтобы запросы выдавали
значения NULL
или значения по умолчанию вместо ошибки при обнаружении
недопустимых входных данных. Чтобы указать значения по умолчанию, можно
использовать функцию TRY
в сочетании с функцией COALESCE
.
TRY
обрабатывает следующие типы ошибок:
Деление на ноль
Неверный аргумент приведения или функции.
Числовое значение вне диапазона
Примеры#
Исходная таблица с некоторыми неверными данными:
SELECT * FROM shipping;
origin_state | origin_zip | packages | total_cost
--------------+------------+----------+------------
California | 94131 | 25 | 100
California | P332a | 5 | 72
California | 94025 | 0 | 155
New Jersey | 08544 | 225 | 490
(4 rows)
Ошибка запроса без TRY
:
SELECT CAST(origin_zip AS BIGINT) FROM shipping;
Query failed: Cannot cast 'P332a' to BIGINT
Значения NULL
с TRY
:
SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping;
origin_zip
------------
94131
NULL
94025
08544
(4 rows)
Ошибка запроса без TRY
:
SELECT total_cost / packages AS per_package FROM shipping;
Query failed: Division by zero
Значения по умолчанию для TRY
и COALESCE
:
SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
per_package
-------------
4
14
0
19
(4 rows)