Escolar Documentos
Profissional Documentos
Cultura Documentos
1 Curtir 16
DevMedia
Curtir
Anuncie | Loja | Publique | Assine | Fale conosco 31.203 pessoas curtiram DevMedia.
1 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
A expressão Transact-SQL CASE nos permite colocar a lógica condicional em nossos códigos
T-SQL. Esta lógica condicional nos fornece uma maneira diferente de adição de blocos de
código que podem ser executadas em nossas declarações T-SQL, dependendo de uma
avaliação booleana da lógica condicional, nos dizendo se TRUE ou FALSE. Podemos, inclusive,
colocar várias expressões condicionais em uma única expressão CASE. Para melhor
compreendermos a forma como a expressão CASE realmente funciona, vamos rever a sintaxe
da expressão CASE, apresentada pela Listagem 1, e em seguida, passaremos por uma série
de exemplos diferentes que irão mostrar alguns conceitos e suas utilidades.
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.
2 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
Independentemente de qual formato CASE seja utilizado, cada cláusula WHEN é comparada
na ordem em que aparece. O resultado da expressão CASE será baseado na primeira cláusula
WHEN que é avaliada como TRUE. Se nenhuma cláusula WHEN for avaliada como TRUE,
então a expressão ELSE é retornada. Quando a cláusula ELSE é omitida e nenhuma cláusula
WHEN for avaliada como TRUE, em seguida, um valor NULL será retornado.
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.
3 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
Para demonstrarmos como funciona a expressão CASE simples, vamos executar primeiro o
código presente na Listagem 3.
use Testes;
SELECT YEAR(OrdemData) AS OrdemAno,
CASE YEAR(OrdemData)
WHEN 2014 THEN 'Ano 1'
WHEN 2013 THEN 'Ano 2'
WHEN 2012 THEN 'Ano 3'
ELSE 'Ano 4 e posteriores' END AS TipoAno
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.
4 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
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.
use Testes;
SELECT YEAR(OrdemData) AS OrdemAno,
CASE YEAR(OrdemData)
WHEN 2014 THEN 'Ano 1'
WHEN 2013 THEN 'Ano 2'
WHEN 2012 THEN 'Ano 3' END AS TipoAno
FROM OrdemServico;
5 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
6 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
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;
SELECT YEAR(OrdemData) AS OrdemAno,
CASE
WHEN YEAR(OrdemData) = 2014 THEN 'Ano 1'
WHEN YEAR(OrdemData) = 2013 THEN 'Ano 2'
WHEN YEAR(OrdemData) = 2012 THEN 'Ano 3'
WHEN YEAR(OrdemData) < 2012 THEN 'Ano 4 e posteriores' END A
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.
7 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
Listagem 6. Exemplo onde múltiplas expressões WHEN são avaliadas como TRUE.
use Testes;
SELECT OrdemValor,
CASE
WHEN OrdemValor < 500 THEN 'Abaixo de 500'
WHEN OrdemValor < 300 THEN 'Abaixo de 300'
WHEN OrdemValor < 200 THEN 'Valores menores que 200'
ELSE ' Valores diferentes do especificado.'
END AS Categoria_OrdemValor
FROM OrdemServico;
8 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
Ao analisarmos os resultados da consulta, podemos ver que cada pedido é relatado como
sendo abaixo de 500, e nós sabemos que isso é incorreto. Isso aconteceu porque só usamos
o operador de menor que ("<") para classificarmos de forma simplista as Ordens que levam a
múltiplas cláusulas WHEN como resultado para serem avaliadas como verdadeiras na
expressão CASE. Porém, a ordenação das cláusulas WHEN não permitiu que a expressão
correta fosse retornada. Reordenaremos então nossas cláusulas WHEN para que possamos
obter os resultados da forma que desejamos. O código presente na Listagem 7 é o mesmo
que o da Listagem 6, porém, aqui temos as cláusulas reordenadas para categorizar
corretamente nossas ordens.
use Testes;
SELECT OrdemValor,
CASE
WHEN OrdemValor < 200 THEN 'Abaixo de 200'
WHEN OrdemValor < 300 THEN 'Abaixo de 300'
WHEN OrdemValor < 500 THEN 'Valores menores que 500'
9 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
10 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
use Testes;
SELECT OrdemValor,
CASE
WHEN OrdemValor < 200 THEN 'Ordem abaixo de 200 Reais'
WHEN OrdemValor < 300 THEN 'Ordem abaixo de 300 Reais'
WHEN OrdemValor < 500 THEN
CASE
WHEN Pago = 'S'
THEN 'Ordem acima de 300 R
ELSE 'Ordem de 300 Reais c
ELSE
CASE
WHEN Pago = 'N'
THEN 'Ordem de 500 Reais s
ELSE 'Ordem acima de 500 R
END AS Categoria_OrdemValor
FROM OrdemServico;
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.
11 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
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.
12 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
use Testes;
SELECT OrdemValor,
CASE
WHEN OrdemValor > 200 THEN 'Acima do valor'
ELSE 'Abaixo do valor' END AS OrdemType
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.
use Testes;
SELECT OrdemValor,
IIF(OrdemValor > 200,
'Acima do valor',
'Abaixo do valor') AS OrdemTipe
FROM OrdemServico;
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.
13 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
use Testes;
SELECT OrdemValor,
IIF (OrdemValor < 130,
'Abaixo de 130',
(IIF (OrdemValor < 200,
'Abaixo de 200',
(IIF (OrdemValor < 300,
(IIF (Pago = 'N',
'Ordem de 200 Sem
'Ordem de 200 como
)
),
(IIF (Pago = 'N',
'Ordem de 300 Sem
'Ordem de 300 com
)
)
)
)
)
)
) AS Categoria_OrdemValor
FROM OrdemServico;
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.
14 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
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.
Até a próxima!
Graduado em Sistemas de informação pela Faculdade Joaquim Nabuco - Recife - PE. Pós - graduando em Banco de
dados Oracle pela Faculdade Maurício de Nassau - Recife. Trabalho com desenvolvimento de sites e sistemas em
PHP, utiliza [...]
Publicidade
15 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
Serviços
Inclua um comentário
+Banco de
dados
16 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
17 de 18 20/09/2014 19:27
Trabalhando com expressões CASE e a Função IIF no T-SQL http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
18 de 18 20/09/2014 19:27