SQL Server tem uma capacidade única de lhe permitir executar lógica programática em tempo real sobre os valores dentro da sua consulta. Com base nessas avaliações lógicas, pode gerar vários valores como parte do conjunto de dados devolvidos.
Usando a Declaração CASE
Isto é mais facilmente realizado em todas as versões do SQL Server usando a instrução CASE
, que actua como uma expressão lógica IF...THEN...ELSE
e retorna vários valores dependendo do resultado.
Neste exemplo abaixo, queremos devolver uma coluna adicional locale
que especifica se o nosso livro tem lugar na Terra Média ou na Terra antiga regular.
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
antes de examinarmos o aspecto especial CASE
desta afirmação, vamos remover temporariamente o CASE
para notar que esta é uma declaração extremamente simples SELECT
na superfície:
SELECT books.*FROM books
Por isso, vamos examinar como a secção CASE
está estruturada e qual o comportamento lógico que estamos a executar.
CASE WHEN books.title = 'The Hobbit' THEN 'Middle-earth' WHEN books.primary_author = 'Tolkien' THEN 'Middle-earth' ELSE 'Earth'END AS locale
Para começar, inicializamos a declaração CASE
e depois especificamos em que condições (WHEN
) a nossa declaração CASE
deve avaliar um resultado. Neste exemplo, estamos a examinar o books.title
e books.primary_author
; se qualquer das duas se enquadrar no nosso tema Tolkien-esque, THEN
devolvemos o valor ‘Middle-earth’. Se nenhum dos campos corresponder à nossa pesquisa, devolvemos o valor de ‘Terra’.
Para reorganizar a lógica como um código psuedo-code IF...THEN...ELSE
declaração, estamos simplesmente a pedir SQL para avaliar:
IF title == 'The Hobbit' OR primary_author == 'Tolkien'THEN RETURN 'Middle-earth'ELSE RETURN 'Earth'END
Finalmente, é fundamental lembrar que uma declaração CASE
deve ser sempre anexada no final com uma declaração correspondente END
. No exemplo acima, estamos também a renomear o valor resultante que é devolvido a locale
, embora isso seja certamente opcional.
Usando a função IIF
Se estiver a utilizar uma versão mais moderna de SQL, é útil saber que o SQL Server 2012 introduziu a muito útil função IIF
IIF
é um método abreviado para executar uma IF...ELSE
CASE
declaração e retornar um de dois valores, dependendo da avaliação do resultado.
Reestruturar o nosso exemplo acima para usar IIF
é bastante simples.
SELECT IIF( books.title = 'The Hobbit' OR books.primary_author = 'Tolkien', 'Middle-earth', 'Earth') AS locale, books.*FROM books
Com uma função IIF
, substituímos em grande parte muito do açúcar sintáctico da declaração CASE
por alguns simples comma-seperadores para diferenciar os nossos argumentos.
tudo dito, tanto CASE
como IIF
fazer o mesmo trabalho, mas se for dada a escolha, IIF
será geralmente muito mais simples de usar.