Выражение 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 | +----------------------------+---------------------------+