CASE¶
CASE
является общим условным выражением и строится по схеме,
похожей на if/else в других языках программирования:
Синтаксис¶
Выражение¶
Диаграмма
Литерал¶
Диаграмма
Выражение CASE с условиями¶
В данной форме CASE
выражение после WHEN
является условием, которое
возвращает результат типа boolean. Если условие выполняется, то
значением CASE
становится результат, указанный после THEN
. Если
условие не выполняется, то CASE
приобретает значение, указанно после
ELSE
, или, если такого нет, NULL
.
Пример:
SELECT
CASE
WHEN stock > 1000
THEN 'many'
ELSE 'few'
END
FROM items;
Результат
+--------+
| COL_1 |
+========+
| "many" |
|--------|
| "few" |
|--------|
| "few" |
|--------|
| "many" |
|--------|
| "few" |
+--------+
(5 rows)
Простое выражение CASE¶
В простой форме CASE
для срабатывания условия необходимо, чтобы
выражение после CASE
было равно значению после WHEN
.
Пример:
SELECT
CASE TYPE
WHEN 'heavy'
THEN '1'
END
FROM warehouse;
Результат
+-------+
| COL_1 |
+=======+
| "1" |
|-------|
| nil |
|-------|
| "1" |
|-------|
| nil |
|-------|
| nil |
+-------+
(5 rows)
Дополнительные примеры¶
Добавление к результирующей таблице колонки с результатами проверки условия:
SELECT *,
CASE
WHEN stock > 200
THEN 'many'
ELSE 'few'
END
FROM items;
Результат
+----+----------+-------+--------+
| ID | NAME | STOCK | COL_1 |
+================================+
| 1 | "bricks" | 1123 | "many" |
|----+----------+-------+--------|
| 2 | "panels" | 998 | "many" |
|----+----------+-------+--------|
| 3 | "piles" | 177 | "few" |
|----+----------+-------+--------|
| 4 | "bars" | 90211 | "many" |
|----+----------+-------+--------|
| 5 | "blocks" | 16 | "few" |
+----+----------+-------+--------+
(5 rows)
Явное указание имен для всех колонок:
SELECT id,name,stock,
CASE
WHEN stock > 200
THEN 'many'
ELSE 'few'
END AS stock_eval
FROM items;
Результат
+----+----------+-------+------------+
| ID | NAME | STOCK | STOCK_EVAL |
+====================================+
| 1 | "bricks" | 1123 | "many" |
|----+----------+-------+------------|
| 2 | "panels" | 998 | "many" |
|----+----------+-------+------------|
| 3 | "piles" | 177 | "few" |
|----+----------+-------+------------|
| 4 | "bars" | 90211 | "many" |
|----+----------+-------+------------|
| 5 | "blocks" | 16 | "few" |
+----+----------+-------+------------+
(5 rows)