Перейти к содержанию

CASE

CASE является общим условным выражением и строится по схеме, похожей на if/else в других языках программирования:

Синтаксис

CASE expression WHEN expression THEN expression ELSE expression END

Выражение

Диаграмма

table . column expression IS NOT NULL OR AND * / + - = > < >= <= <> != expression NOT BETWEEN expression AND expression IN ( select values ) NOT EXISTS ( select values TO_DATE TO_CHAR ( expression , format TRIM ( LEADING TRAILING BOTH expression LEADING TRAILING BOTH FROM expression ( select values expression , ) literal cast NOT expression CURRENT_DATE CASE expression WHEN expression THEN expression ELSE expression END

Литерал

Диаграмма

TRUE FALSE NULL ? $ unsigned integer double decimal string

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