Выражение CASE

Описание

Выражение CASE представляет собой общее условное выражение. Условия записываются через конструкции WHEN …​ THEN.

Синтаксис

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END
CASE <expression>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

Параметры

  • <condition>
    Указывает условие — выражение, которое должно вычисляться в булево значение (True, False или NULL).


  • <expression>
    Общее выражение.


  • <value>
    Значение, совпадение с которым проверяется для выражения <expression>. Значение может быть литералом или выражением. Значение должно иметь тот же тип данных, что и <expression>, или иметь тип данных, который можно преобразовать в тип данных <expression>.


  • <result>
    Результат, который возвращает выражение. Если одно условие истинно, то возвращается соответствующий результат. Если истинно более одного условия, то возвращается результат, заданный в первом истинном условии. Если присутствует опциональный оператор ELSE и не найдено ни одного совпадения в WHEN, то выражение возвращает результат по ELSE. Если оператор ELSE отсутствует и не найдено ни одного совпадения в WHEN, то результатом будет NULL.

Примеры

  • Создадим таблицу из чисел с 1 до 10. В колонку result запишем результат сравнения чисел с числом 5.

    CREATE TABLE demo.numbers AS
        SELECT unnest(generate_series(1,10)) AS number;
    
    SELECT
        number,
        CASE
            WHEN number < 5 THEN 'less than 5'
            WHEN number > 5 THEN 'more than 5'
            ELSE 'equal to 5'
        END AS result
    FROM demo.numbers;
    +--------+-------------+
    | number | result      |
    +--------+-------------+
    | 1      | less than 5 |
    +--------+-------------+
    | 2      | less than 5 |
    +--------+-------------+
    | 3      | less than 5 |
    +--------+-------------+
    | 4      | less than 5 |
    +--------+-------------+
    | 5      | equal to 5  |
    +--------+-------------+
    | 6      | more than 5 |
    +--------+-------------+
    | 7      | more than 5 |
    +--------+-------------+
    | 8      | more than 5 |
    +--------+-------------+
    | 9      | more than 5 |
    +--------+-------------+
    | 10     | more than 5 |
    +--------+-------------+
  • Создадим таблицу городов с указанием стран и населения. Подсчитаем для городов из России среднее значение населения, а для городов из Испании — максимальное значение:

    CREATE TABLE demo.cities(city_name VARCHAR, city_country VARCHAR, city_population BIGINT);
    
    INSERT INTO demo.cities VALUES
        ('Moscow', 'Russia', 13000000),
        ('Saint Petersburg', 'Russia', 5600000),
        ('Madrid', 'Spain', 3400000),
        ('Barcelona', 'Spain', 1700000);
    
    SELECT
        avg(CASE WHEN city_country == 'Russia' THEN city_population END)
        AS "Russia avg city population",
        max(CASE WHEN city_country == 'Spain' THEN city_population END)
        AS "Spain max city population"
    FROM demo.cities;
    +----------------------------+---------------------------+
    | russia avg city population | spain max city population |
    +----------------------------+---------------------------+
    | 9300000                    | 3400000                   |
    +----------------------------+---------------------------+