SQL Server има уникална способност да ви позволи да изпълнявате програмна логика в реално време върху стойностите във вашата заявка. Въз основа на тези логически оценки можете да генерирате различни стойности като част от върнатия набор от данни.
Използване на оператора CASE
Това се постига най-лесно във всички версии на SQL Server с помощта на CASE
оператор, който действа като логически IF...THEN...ELSE
израз и връща различни стойности в зависимост от резултата.
В този пример по-долу искаме да върнем допълнителен locale
колона, която посочва дали действието на нашата книга се развива в Средната земя или обикновената стара Земя.
SELECT
CASE
WHEN
books.title = 'The Hobbit'
THEN
'Middle-earth'
WHEN
books.primary_author = 'Tolkien'
THEN
'Middle-earth'
ELSE
'Earth'
END AS locale,
books.*
FROM
books
Преди да разгледаме специалния CASE
аспект на това изявление, нека временно премахнем CASE
за да забележите, че това е изключително прост SELECT
изявление на повърхността:
SELECT
books.*
FROM
books
Затова нека разгледаме как CASE
секцията е структурирана и какво логическо поведение изпълняваме.
CASE
WHEN
books.title = 'The Hobbit'
THEN
'Middle-earth'
WHEN
books.primary_author = 'Tolkien'
THEN
'Middle-earth'
ELSE
'Earth'
END AS locale
За да започнем, ние инициализираме CASE
след това посочете при какви условия (WHEN
) нашия CASE
изявлението трябва да оцени резултата. В този пример разглеждаме books.title
и books.primary_author
; ако някое от тях отговаря на нашата тема в стил Толкин, THEN
връщаме стойността „Средната земя“. Ако нито едно поле не отговаря на нашето търсене, вместо това връщаме стойността на „Земя“.
За да пренаредите логиката като псевдокод IF...THEN...ELSE
изявление, ние просто молим SQL да оцени:
IF
title == 'The Hobbit' OR
primary_author == 'Tolkien'
THEN
RETURN 'Middle-earth'
ELSE
RETURN 'Earth'
END
И накрая, важно е да запомните, че CASE
изявлението винаги трябва да се добавя в края със съответстващ END
изявление. В горния пример ние също преименуваме получената стойност, която се връща на locale
, въпреки че това със сигурност не е задължително.
Използване на функцията IIF
Ако използвате по-модерна версия на SQL, полезно е да знаете, че SQL Server 2012 представи много удобния IIF
функция. IIF
е съкратен метод за изпълнение на IF...ELSE
/CASE
оператор и връщане на една от двете стойности, в зависимост от оценката на резултата.
Преструктуриране на горния пример за използване на IIF
е доста проста.
SELECT
IIF(
books.title = 'The Hobbit' OR books.primary_author = 'Tolkien',
'Middle-earth',
'Earth')
AS locale,
books.*
FROM
books
С IIF
функция, ние до голяма степен заместваме голяма част от синтактичната захар от CASE
изявление с няколко прости разделители със запетая, за да разграничим нашите аргументи.
Всичко казано, и двата CASE
и IIF
свършите същата работа, но ако имате избор, IIF
обикновено ще бъде много по-лесно за използване.