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

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)