Публикации
Публикации  »  Базы данных, T-SQL

Выбор поля в зависимости от условия в SQL-запросе

Иногда бывает нужно, чтобы в sql-запросе в случае выполнения условия происходила выборка по одному полю (или выражению), а в противном случае происходила выборка другого поля (или выражения), т.е. выбор поля или выражения в зависимости от условия. Либо, необходимо обновить значения в базе данных в зависимости от условия. Для решения этой задачи нужно использовать оператор CASE. У этого оператора есть 2 варианта синтаксиса, каждый из которых удобен в своих случаях. Просто приведу наглядные примеры обоих способов.

Пример 1. Вывод разных результатов в зависимости от того, какое значение в поле.

SELECT   ProductNumber, Category =
      CASE ProductLine
         WHEN 'R' THEN 'Road'
         WHEN 'M' THEN 'Mountain'
         WHEN 'T' THEN 'Touring'
         WHEN 'S' THEN 'Other sale items'
         ELSE 'Not for sale'
      END,
   Name
FROM Production.Product
ORDER BY ProductNumber

В данном примере всё просто: если ProductLine = 'R', то в выборке результатов будет текст "Road", если ProductLine = 'M' - тогда получим в результатах "Mountain" и т.д.

Пример 2. Более сложное условие для получения разного текста в зависимости от значения в поле.

SELECT   ProductNumber, Name, 'Price Range' = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber

Пример 3. Использование конструкции наподобие "IF THEN ELSE" в запросе

SELECT FirstName, LastName, TelephoneNumber, 
     CASE
          WHEN TelephoneSpecialInstructions IS NULL 
          THEN 'Any time'
          ELSE TelephoneSpecialInstructions
     END 
     AS WhenContact
FROM Person.vAdditionalContactInfo

Пример 4. Использование условия при сортировке результатов запроса в ORDER BY

SELECT EmployeeID, EmployeeFIO, SalariedFlag
FROM Employee
ORDER BY CASE WHEN SalariedFlag = 1 THEN EmployeeID
              WHEN SalariedFlag = 0 THEN EmployeeFIO 
         END

Принцип сортировки с условием в том, что сначала будут получены все значения в зависимости от условия (т.е. будет получено доп.поле), после чего весь результат запроса будет отсортирован по результатам выполнения условия. Именно поэтому, результаты выполнения условия должны быть одинакового типа данных.

Пример 5. Обновление поля новыми данными в зависимости от условия.

UPDATE Employee
SET VacationHours = 
    CASE
        WHEN VacationHours < 10 
        THEN VacationHours + 40
        ELSE VacationHours + 20
    END
OUTPUT Deleted.EmployeeID, 
       Deleted.VacationHours AS BeforeValue, 
       Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0

В этом примере к полю VacationHours добавляется 40, если VacationHours меньше 10, иначе добавляется 20. После выполнения обновлений запрос так же выведет таблицу с колонками EmployeeID и значением поля VacationHours "До" и "После" обновления.

Информация для статьи взята с сайта microsoft

 

Категория: Базы данных, T-SQL

Комментарии к статье:

01.08.18   Гость Спасибо

Добавить комментарий: