Escolar Documentos
Profissional Documentos
Cultura Documentos
Artigos Banco de Dados Trabalhando com expressões CASE e a Função IIF no T-SQL
Expressão CASE
Para começarmos, precisamos observar que a expressão CASE possui dois formatos
diferentes, um simples e o reviewed (revisto). Cada um destes tipos possui um formato
ligeiramente diferente, ambos estão sendo apresentados na Listagem 1.
1
2 - Expressão Case simples:
3 CASE input_expression
4 WHEN when_expression THEN result_expression [ ...n ]
5 [ ELSE else_result_expression ]
END
6 - Expressão Case Searched (busca):
7 CASE
8 WHEN Boolean_expression THEN result_expression [ ...n ]
9 [ ELSE else_result_expression ]
END
1
0
Ao analisarmos os dois formatos apresentados para a expressão CASE, presentes na
Listagem 1, podemos observar que cada um dos formatos oferece uma forma diferente
de identificar uma das múltiplas expressões que determinam os resultados da expressão
CASE. Em ambos os tipos de CASE, um teste booleano é realizado para cada uma das
cláusulas WHEN. Após a palavra CASE, temos então o nosso termo de pesquisa, o qual
é chamado de input_expression, que será verificado após o WHEN onde colocamos
então a condição que deverá ser satisfeita. Numa expressão CASE simples do operador
entre o "input_expression" e o "when_expression" é sempre o operador de igualdade.
Enquanto que com a expressão CASE searched, cada cláusula WHEN irá conter um
"Boolean_expression". Este "Boolean_expression" pode ser uma expressão booleana
simples com um único operador, ou uma expressão booleana complexa, que pode
apresentar várias condições diferentes. Além disso, a expressão CASE searched pode
usar o conjunto completo de operadores booleanos.
Vamos então começar com alguns testes para esclarecer dúvidas com relação a
utilização das expressões CASE. Para isso, criemos uma nova base de dados chamada
de Testes e em seguida, vamos criar a nossa tabela de demonstrações, que será
semelhante a apresentada pela Listagem 2, a qual será chamada de OrdemServico. Caso
tenham interesse em acompanhar os testes de forma prática, criem então esta tabela em
sua instância do SQL Server, no nosso caso, estamos utilizando o SQL Server 2014.
Como estamos inserindo direto na base de dados os valores, devemos passar as datas e
os valores monetários no formato americano, mas caso queiram fazer a mudança para
formatos diferentes, fiquem a vontade. Sigamos agora para o nosso primeiro exemplo de
utilização.
1use Testes;
2 SELECT YEAR(OrdemData) AS OrdemAno,
3 CASE YEAR(OrdemData)
WHEN 2014 THEN 'Ano 1'
4 WHEN 2013 THEN 'Ano 2'
5 WHEN 2012 THEN 'Ano 3'
6 ELSE 'Ano 4 e posteriores' END AS
7TipoAno
8 FROM OrdemServico;
Se analisarmos o código apresentado pela Listagem 3 podemos observar que, logo após
a palavra CASE, especificamos o ano como sendo "ANO (OrdemData)" e depois
seguimos por mais outras cláusulas, onde cada uma possuía um ano diferente,
começando com o ano de 2014.
Quando a nossa expressão CASE simples é avaliada, ela usa o operador de igualdade
("=") entre o "ANO (OrdemData)" e o Valor, e quando as expressões são diferentes.
Portanto, o código da Listagem 3 irá exibir "Ano 1" para a coluna TipoAno que tenha
linhas com um valor de ano OrdemData de "2014", ou então irá exibir "Ano 2" para
linhas com um ano OrdemData de "2013" e assim por diante. Se o ano da OrdemData
não corresponder a nenhuma das cláusulas passadas, a condição vai exibir "Ano 4 e
posteriores". Quando executamos o código presente na Listagem 3, recebemos o
resultado presente na Figura 1.
Neste exemplo, executaremos o código presente na Listagem 4, que irá nos mostrar o
que acontece quando uma simples expressão CASE não possui uma cláusula ELSE.
Ao analisarmos a saída apresentada pela Figura 2, podemos ver que quando o ano do
OrdemData na tabela OrdemServico não cumpre com qualquer uma das condições para
a cláusula WHEN, o SQL Server exibe "NULL" como valor para o TipoAno.
A expressão simples do CASE com as cláusulas WHEN foi avaliada com base no
operador de igualdade. Já no caso das expressões CASE do tipo searched, podemos
fazer uso de outros operadores e a sintaxe da expressão CASE será um pouco diferente.
Para que possamos demonstrar isso, vamos dar uma olhada no código apresentado pela
Listagem 5.
use Testes;
1 SELECT YEAR(OrdemData) AS OrdemAno,
CASE
2 WHEN YEAR(OrdemData) = 2014 THEN
3'Ano 1'
4 WHEN YEAR(OrdemData) = 2013 THEN
5'Ano 2'
6 WHEN YEAR(OrdemData) = 2012 THEN
'Ano 3'
7 WHEN YEAR(OrdemData) < 2012 THEN
8'Ano 4 e posteriores' END AS TipoAno
FROM OrdemServico;
Podem haver situações em que diferentes cláusulas WHEN são avaliadas como
verdadeiro dentro de uma única expressão CASE. Então, quando isso acontece, o SQL
Server retorna o resultado da expressão associada ao primeiro WHEN que for avaliado
como true. No entanto, a ordem de execução das cláusulas WHEN irá controlar o
resultado obtido que retorna da expressão CASE quando múltiplas cláusulas WHEN são
avaliadas como TRUE.
Para demonstrarmos como este processo ocorre, iremos usar a expressão CASE para
exibir ordens de "500 Reais" quando o OrdemValor estiver dentro do limite dos R$ 500,
"300 Reais" quando o OrdemValor estiver dentro da faixa da R$ 300 e "< 200 Reais"
quando o OrdemValor for menor que R$ 200 e quando uma OrdemValor não estiver de
acordo com nenhuma dessas categorias, então classificaremos a ordem como "Valores
diferentes do especificado". Vamos ver então o código presente na Listagem 6 para
demonstrarmos o que acontece quando múltiplas expressões WHEN são avaliadas como
TRUE ao tentarmos categorizar as ordens em uma dessas categorias de valores
Categoria_OrdemValor.
Listagem 6. Exemplo onde múltiplas expressões WHEN são avaliadas como TRUE.
use Testes;
1 SELECT OrdemValor,
2 CASE
WHEN OrdemValor < 500 THEN 'Abaixo
3de 500'
4 WHEN OrdemValor < 300 THEN 'Abaixo
5de 300'
6 WHEN OrdemValor < 200 THEN
'Valores menores que 200'
7 ELSE ' Valores diferentes do
8especificado.'
9 END AS Categoria_OrdemValor
FROM OrdemServico;
use Testes;
1 SELECT OrdemValor,
2 CASE
WHEN OrdemValor < 200 THEN 'Abaixo
3de 200'
4 WHEN OrdemValor < 300 THEN 'Abaixo
5de 300'
6 WHEN OrdemValor < 500 THEN
'Valores menores que 500'
7 ELSE ' Valores diferentes do
8especificado.'
9 END AS Categoria_OrdemValor
FROM OrdemServico;
1 use Testes;
SELECT OrdemValor,
2
CASE
3 WHEN OrdemValor < 200 THEN 'Ordem
4 abaixo de 200 Reais'
5 WHEN OrdemValor < 300 THEN 'Ordem
6 abaixo de 300 Reais'
WHEN OrdemValor < 500 THEN
7 CASE
8 WHE
9 N Pago = 'S'
1
0
1
1 THEN 'Ordem acima de 300 Reais sem estar Pago'
1
ELSE 'Ordem de 300 Reais como Pago' END
2 ELSE
1 CASE
3 WHE
1 N Pago = 'N'
4
THEN 'Ordem de 500 Reais sem estar como Pago'
1
5 ELSE 'Ordem acima de 500 Reais estando como Pago' END
1 END AS Categoria_OrdemValor
6 FROM OrdemServico;
1
7
Até agora, todos os nossos exemplos usaram expressões CASE para criar uma string de
resultados, colocando a expressão CASE na lista de seleção de uma instrução SELECT
do T-SQL. Também podemos usar uma expressão CASE em instruções de UPDATE,
DELETE e instruções do tipo SET. Além disso, a expressão CASE pode ser usada em
conjunto com IN, WHERE, ORDER BY e HAVING. Na Listagem 9 estaremos usando
uma expressão CASE com uma cláusula WHERE.
1use Testes;
2 SELECT *
3 FROM OrdemServico
WHERE CASE YEAR(OrdemData)
4 WHEN 2014 THEN 'Ano 1'
5 WHEN 2013 THEN 'Ano 2'
6 WHEN 2012 THEN 'Ano 3'
7 ELSE 'Ano 4 e posteriores' END =
8'Ano 1';
A partir da versão 2012 do SQL Server, a Microsoft adicionou a função IIF. A função
IIF pode ser considerado um atalho para a instrução CASE. Na Listagem 10 podemos
encontrar a sintaxe para a função IIF.
Para demonstrarmos como a função IIF pode ser usada para substituir a expressão
CASE, vamos rever o código no qual usamos a expressão CASE searched presente na
Listagem 11.
use Testes;
1 SELECT OrdemValor,
2 CASE
3 WHEN OrdemValor > 200 THEN 'Acima
4do valor'
5 ELSE 'Abaixo do valor' END AS
OrdemType
6 FROM OrdemServico;
O código presente na Listagem 11 possui apenas uma única expressão WHEN que é
utilizada para determinar se o OrdemValor é uma ordem de alta ou baixa do valor
especificado. Se a expressão WHEN "OrdemValor > 200" for avaliada como TRUE,
então o valor OrdemType está definido para "Acima do valor". Se a expressão WHEN é
avaliada como FALSE então "Abaixo do valor" será definido para o valor OrdemType.
O código reescrito da função que usamos em vez de uma expressão CASE IIF pode ser
encontrado presente na Listagem 12.
1use Testes;
2 SELECT OrdemValor,
IIF(OrdemValor > 200,
3 'Acima do valor',
4
'Abaixo do valor') AS OrdemTipe
5 FROM OrdemServico;
6
Ao olharmos para a Listagem 12 podemos ver o porquê da função IIF ser considerada
uma versão abreviada da expressão CASE. A palavra CASE é substituída pelo "IIF
("string, a cláusula "então" é substituída por uma vírgula, a cláusula "senão" é
substituído por uma vírgula e a palavra "END" é substituída por um ")". Quando a
expressão booleana "OrdemValor > 200". É verdade que o valor " Acima do valor " é
exibido. Quando a expressão booleana 'OrdemValor > 200 " é avaliada como FALSE
então o" Abaixo do valor" é exibido. Se executarmos o código presente nas Listagem
11 e 12, veremos que ambos produzem o mesmo resultado.
Assim como a expressão CASE do SQL Server permite que aninhemos funções IIF. Na
Listagem 13 temos um exemplo de aninhamento com a função IIF.
1 use Testes;
SELECT OrdemValor,
2
IIF (OrdemValor < 130,
3 'Abaixo de 130',
4 (IIF (OrdemValor < 200,
5 'Abaixo de 200',
6 (IIF (OrdemValor < 300,
(IIF (Pago = 'N',
7
8 'Ordem de 200 Sem ser como Pago',
9
1 'Ordem de 200 como Pago'
0
)
1
1 ),
1
2 (IIF (Pago = 'N',
1 'Ordem de 300 Sem ser como Pago',
3
1 'Ordem de 300 como Pago'
4
1 )
)
5
1 )
6 )
1 )
7 )
) AS Categoria_OrdemValor
1 FROM OrdemServico;
8
1
9
2
0
2
1
2
2
2
3
Neste exemplo podemos ver que usamos a função IIF várias vezes. Cada um adicional é
usado tanto no "valor verdadeiro" quanto no "valor falso" da função IIF. O código
presente na Listagem 13 é equivalente ao código que usa a expressão CASE aninhada
presente na Listagem 8.
Assim como ocorre com a maioria das funcionalidades presentes no T-SQL, existem
limitações quanto ao uso das mesmas. Abaixo estão algumas limitações a serem
observadas em relação ao uso das funções IIF e expressões CASEs.
Com isso finalizamos mais este artigo sobre T-SQL, onde mostramos que a expressão
CASE e a função IIF nos permitem colocar a expressão lógica no código T-SQL que vai
mudar os resultados de nosso código com base nos resultados avaliados de uma
expressão. Usando a expressão de comparação suportada pela função IIF e a expressão
CASE podem ter diferentes blocos de códigos executados, dependendo se a expressão
de comparação é avaliada como VERDADEIRO ou FALSO. A expressão CASE e a
função IIF nos fornecem o controle programático para atender aos requisitos do nosso
negócio de forma mais simples e de fácil utilização.