Поиск…
Вступление
Выражение CASE используется для реализации логики if-then.
Синтаксис
- CASE input_expression
КОГДА compare1 THEN result1
[WHEN compare2 THEN result2] ...
[ELSE resultX]
КОНЕЦ - ДЕЛО
КОГДА условие1 THEN result1
[КОГДА условие2 THEN result2] ...
[ELSE resultX]
КОНЕЦ
замечания
Простое выражение CASE возвращает первый результат, compareX
значение compareX
равно input_expression
.
Выбранное выражение CASE возвращает первый результат, conditionX
которого истинно.
Искал CASE в SELECT (Соответствует логическому выражению)
Выбранный CASE возвращает результаты, когда логическое выражение TRUE.
(Это отличается от простого случая, который может проверять только на эквивалентность ввода.)
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
Я бы | ItemId | Цена | PriceRating |
---|---|---|---|
1 | 100 | 34,5 | ДОРОГО |
2 | 145 | 2,3 | ДЕШЕВЫЕ |
3 | 100 | 34,5 | ДОРОГО |
4 | 100 | 34,5 | ДОРОГО |
5 | 145 | 10 | ДОСТУПНЫЙ |
Используйте CASE для COUNT, количество строк в столбце соответствует условию.
Случай использования
CASE
может использоваться совместно с SUM
для возврата количества только тех элементов, которые соответствуют предварительно определенному условию. (Это похоже на COUNTIF
в Excel.)
Хитрость заключается в возврате двоичных результатов, указывающих совпадения, поэтому возвращаемые «1» для сопоставления записей могут быть суммированы для подсчета общего количества совпадений.
Учитывая эту таблицу ItemSales
, скажем, вы хотите узнать общее количество предметов, которые были классифицированы как «Дорогие»:
Я бы | ItemId | Цена | PriceRating |
---|---|---|---|
1 | 100 | 34,5 | ДОРОГО |
2 | 145 | 2,3 | ДЕШЕВЫЕ |
3 | 100 | 34,5 | ДОРОГО |
4 | 100 | 34,5 | ДОРОГО |
5 | 145 | 10 | ДОСТУПНЫЙ |
запрос
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Результаты:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
Альтернатива:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
Сокращенный CASE в SELECT
Сокращенный вариант CASE
оценивает выражение (обычно столбца) относительно ряда значений. Этот вариант немного короче и сохраняет повторение оцененного выражения снова и снова. Предложение ELSE
все еще можно использовать:
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
Слово предостережения. Важно понимать, что при использовании короткого варианта весь оператор оценивается в каждом WHEN
. Поэтому следующее утверждение:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
может дать результат NULL
. Это происходит потому, что каждый WHEN
NEWID()
снова вызывается с новым результатом. Эквивалент:
SELECT
CASE
WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
END
Поэтому он может пропустить все случаи WHEN
и результат как NULL
.
CASE в предложении ORDER BY
Мы можем использовать 1,2,3 .. для определения типа порядка:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
Я БЫ | ОБЛАСТЬ, КРАЙ | ГОРОД | ОТДЕЛ | EMPLOYEES_NUMBER |
---|---|---|---|---|
12 | Новая Англия | Бостон | МАРКЕТИНГ | 9 |
15 | запад | Сан-Франциско | МАРКЕТИНГ | 12 |
9 | Средний Запад | Чикаго | ПРОДАЖИ | 8 |
14 | Mid-Atlantic | Нью-Йорк | ПРОДАЖИ | 12 |
5 | запад | Лос-Анджелес | ИССЛЕДОВАНИЕ | 11 |
10 | Mid-Atlantic | Филадельфия | ИССЛЕДОВАНИЕ | 13 |
4 | Средний Запад | Чикаго | ИННОВАЦИИ | 11 |
2 | Средний Запад | Детройт | ОТДЕЛ КАДРОВ | 9 |
Использование CASE в UPDATE
образец повышения цен:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
Использование CASE для значений NULL, заказанных последними
таким образом, «0», представляющий известные значения, занимает первое место, «1», представляющее значения NULL, сортируется по последнему:
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
Я БЫ | ОБЛАСТЬ, КРАЙ | ГОРОД | ОТДЕЛ | EMPLOYEES_NUMBER |
---|---|---|---|---|
10 | Mid-Atlantic | Филадельфия | ИССЛЕДОВАНИЕ | 13 |
14 | Mid-Atlantic | Нью-Йорк | ПРОДАЖИ | 12 |
9 | Средний Запад | Чикаго | ПРОДАЖИ | 8 |
12 | Новая Англия | Бостон | МАРКЕТИНГ | 9 |
5 | запад | Лос-Анджелес | ИССЛЕДОВАНИЕ | 11 |
15 | НОЛЬ | Сан-Франциско | МАРКЕТИНГ | 12 |
4 | НОЛЬ | Чикаго | ИННОВАЦИИ | 11 |
2 | НОЛЬ | Детройт | ОТДЕЛ КАДРОВ | 9 |
CASE в предложении ORDER BY для сортировки записей по наименьшему значению из 2 столбцов
Представьте, что вам нужны записи сортировки по наименьшему значению одного из двух столбцов. Некоторые базы данных могут использовать неагрегированную функцию MIN()
или LEAST()
для этого ( ... ORDER BY MIN(Date1, Date2)
), но в стандартном SQL вы должны использовать выражение CASE
.
Выражение CASE
в нижеследующем Date1
Date2
столбцам Date1
и Date2
, проверяет, какой столбец имеет меньшее значение, и сортирует записи в зависимости от этого значения.
Пример данных
Я бы | Date1 | Дата2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
2 | 2017-01-31 | 2017-01-03 |
3 | 2017-01-31 | 2017-01-02 |
4 | 2017-01-06 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
6 | 2017-01-04 | 2017-01-31 |
запрос
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
Результаты
Я бы | Date1 | Дата2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
3 | 2017-01-31 | 2017-01-02 |
2 | 2017-01-31 | 2017-01-03 |
6 | 2017-01-04 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
4 | 2017-01-06 | 2017-01-31 |
объяснение
Поскольку сначала вы видите строку с Id = 1
, потому что Date1
имеет самую низкую запись из всей таблицы 2017-01-01
, строка, где Id = 3
является второй, потому что Date2
равна 2017-01-02
что является вторым самым низким значением из таблицы и так далее.
Таким образом, мы отсортировали записи с 2017-01-01
по 2017-01-06
возрастанию и не заботились о Date1
Date2
являются эти столбцы Date1
или Date2
.