Иногда бывает нужно, чтобы в 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
Комментарии к статье:
Добавить комментарий: