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

CASE

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

Синтаксис

CASE expression WHEN expression THEN expression ELSE expression END

Выражение

Диаграмма

NOT table . column literal case cast current_date substr to_char to_date trim NOT EXISTS ( dql ) ( dql ) ( expression , ) IS NOT NULL expression NOT BETWEEN expression AND + - * / <> != >= > <= < = NOT IN || AND OR expression

Литерал

Диаграмма

TRUE FALSE NULL decimal double integer string unsigned $ unsigned ?

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