Поиск…


Вступление

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow