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