Условные выражения#
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)