Vous êtes sur la page 1sur 18

Trabalhando com expresses CASE e a Funo IIF no T-SQL

1 de 18

CONTEDO

comentrios

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

post favorito (2)

Curtir

16

DevMedia
Curtir

Anuncie | Loja | Publique | Assine | Fale conosco

31.203 pessoas curtiram DevMedia.

Plug-in social do Facebook

Hospedagem web por Porta 80 Web

Todos os Direitos Reservados a

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

2 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

A expresso Transact-SQL CASE nos permite colocar a lgica condicional em nossos cdigos
T-SQL. Esta lgica condicional nos fornece uma maneira diferente de adio de blocos de
cdigo que podem ser executadas em nossas declaraes T-SQL, dependendo de uma
avaliao booleana da lgica condicional, nos dizendo se TRUE ou FALSE. Podemos, inclusive,
colocar vrias expresses condicionais em uma nica expresso CASE. Para melhor
compreendermos a forma como a expresso CASE realmente funciona, vamos rever a sintaxe
da expresso CASE, apresentada pela Listagem 1, e em seguida, passaremos por uma srie
de exemplos diferentes que iro mostrar alguns conceitos e suas utilidades.
Para comearmos, precisamos observar que a expresso CASE possui dois formatos
diferentes, um simples e o reviewed (revisto). Cada um destes tipos possui um formato
ligeiramente diferente, ambos esto sendo apresentados na Listagem 1.
Listagem 1. Sintaxes da expresso CASE.

- Expresso Case simples:


CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
- Expresso Case Searched (busca):
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END

Ao analisarmos os dois formatos apresentados para a expresso CASE, presentes na


Listagem 1, podemos observar que cada um dos formatos oferece uma forma diferente de
identificar uma das mltiplas expresses que determinam os resultados da expresso CASE.
Em ambos os tipos de CASE, um teste booleano realizado para cada uma das clusulas
WHEN. Aps a palavra CASE, temos ento o nosso termo de pesquisa, o qual chamado de
input_expression, que ser verificado aps o WHEN onde colocamos ento a condio que
dever ser satisfeita. Numa expresso CASE simples do operador entre o "input_expression"
e o "when_expression" sempre o operador de igualdade. Enquanto que com a expresso
CASE searched, cada clusula WHEN ir conter um "Boolean_expression". Este

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

3 de 18

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CONTEDO
REVISTAS
CURSOS
APIs
MVP
LOGIN
uma expresso booleana complexa, que pode apresentar vrias condies diferentes. Alm

disso, a expresso CASE searched pode usar o conjunto completo de operadores booleanos.
Independentemente de qual formato CASE seja utilizado, cada clusula WHEN comparada
na ordem em que aparece. O resultado da expresso CASE ser baseado na primeira clusula
WHEN que avaliada como TRUE. Se nenhuma clusula WHEN for avaliada como TRUE,
ento a expresso ELSE retornada. Quando a clusula ELSE omitida e nenhuma clusula
WHEN for avaliada como TRUE, em seguida, um valor NULL ser retornado.

Vamos ento comear com alguns testes para esclarecer dvidas com relao a utilizao das
expresses CASE. Para isso, criemos uma nova base de dados chamada de Testes e em
seguida, vamos criar a nossa tabela de demonstraes, que ser semelhante a apresentada
pela Listagem 2, a qual ser chamada de OrdemServico. Caso tenham interesse em
acompanhar os testes de forma prtica, criem ento esta tabela em sua instncia do SQL
Server, no nosso caso, estamos utilizando o SQL Server 2014.
Listagem 2. Criando a Tabela OrdemServico.

CREATE TABLE OrdemServico (


ID int identity,
OrdemData date,
OrdemValor decimal(10,2),
Pago char(1));
INSERT into OrdemServico VALUES
('12-03-2014', 10.49, NULL),
('10-05-2014', 220.45,'S'),
('06-14-2012', 8.62, NULL),
('04-02-2012', 75.39, NULL),
('07-11-2013', 125.54, NULL),
('04-25-2008', 99.99, NULL),
('11-09-2013', 320.13, 'N'),
('04-05-2010', 175.76, NULL),
('03-27-2011', 1.69, NULL);

Como estamos inserindo direto na base de dados os valores, devemos passar as datas e os
valores monetrios no formato americano, mas caso queiram fazer a mudana para formatos
diferentes, fiquem a vontade. Sigamos agora para o nosso primeiro exemplo de utilizao.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

4 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

Para demonstrarmos como funciona a expresso CASE simples, vamos executar primeiro o
cdigo presente na Listagem 3.
Listagem 3. Expresso CASE com 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'
ELSE 'Ano 4 e posteriores' END AS TipoAno
FROM OrdemServico;

Se analisarmos o cdigo apresentado pela Listagem 3 podemos observar que, logo aps a
palavra CASE, especificamos o ano como sendo "ANO (OrdemData)" e depois seguimos por
mais outras clusulas, onde cada uma possua um ano diferente, comeando com o ano de
2014.
Quando a nossa expresso CASE simples avaliada, ela usa o operador de igualdade ("=")
entre o "ANO (OrdemData)" e o Valor, e quando as expresses so diferentes. Portanto, o
cdigo da Listagem 3 ir exibir "Ano 1" para a coluna TipoAno que tenha linhas com um
valor de ano OrdemData de "2014", ou ento ir exibir "Ano 2" para linhas com um ano
OrdemData de "2013" e assim por diante. Se o ano da OrdemData no corresponder a
nenhuma das clusulas passadas, a condio vai exibir "Ano 4 e posteriores". Quando
executamos o cdigo presente na Listagem 3, recebemos o resultado presente na Figura 1.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

5 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

Figura 1. Resultado obtido pelo CASE simples.

Neste exemplo, executaremos o cdigo presente na Listagem 4, que ir nos mostrar o que
acontece quando uma simples expresso CASE no possui uma clusula ELSE.
Listagem 4. Expresso CASE sem uma clusula 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;

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

6 de 18

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CONTEDO
REVISTAS
CURSOS
APIs
MVP
LOGIN
diferena de no ter uma clusula ELSE especificada. Neste caso, quando executamos o

cdigo da Listagem 4, este nos apresenta os resultados, como os mostrados pela Figura 2.

Figura 2. CASE sem a clusula ELSE.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

7 de 18

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CONTEDO
REVISTAS
CURSOS
APIs
MVP
LOGIN
OrdemData na tabela OrdemServico no cumpre com qualquer uma das condies para a

clusula WHEN, o SQL Server exibe "NULL" como valor para o TipoAno.

A expresso simples do CASE com as clusulas WHEN foi avaliada com base no operador de
igualdade. J no caso das expresses CASE do tipo searched, podemos fazer uso de outros
operadores e a sintaxe da expresso CASE ser um pouco diferente. Para que possamos
demonstrar isso, vamos dar uma olhada no cdigo apresentado pela Listagem 5.
Listagem 5. Expresso CASE do tipo searched.

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;

Se olharmos para o cdigo apresentado na Listagem 5 podemos perceber que a clusula


WHEN vem diretamente aps a expresso CASE sem nenhum texto entre as duas clusulas.
Isto diz ao SQL Server que esta expresso um CASE searched (pesquisado). Alm disso,
observem a expresso booleana que est aps cada clusula WHEN. Como vocs podem ver,
nem todas as expresses booleanas esto usando o operador de igualdade, a ltima
expresso WHEN, por exemplo, usa o operador de menor que ("<"). A expresso CASE que
apresentamos na Listagem 5 logicamente o mesmo que a expresso CASE apresentada na
Listagem 3. Por isso, quando executamos o cdigo da Listagem 5, este produz os mesmos
resultados, como mostrado pela Figura 1, apresentada anteriormente.

Podem haver situaes em que diferentes clusulas WHEN so avaliadas como verdadeiro
dentro de uma nica expresso CASE. Ento, quando isso acontece, o SQL Server retorna o
resultado da expresso associada ao primeiro WHEN que for avaliado como true. No entanto,
a ordem de execuo das clusulas WHEN ir controlar o resultado obtido que retorna da
expresso CASE quando mltiplas clusulas WHEN so avaliadas como TRUE.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

8 de 18

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CONTEDO
REVISTAS
CURSOS
APIs
MVP
LOGIN
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 no estiver de acordo com
nenhuma dessas categorias, ento classificaremos a ordem como "Valores diferentes do
especificado". Vamos ver ento o cdigo presente na Listagem 6 para demonstrarmos o que
acontece quando mltiplas expresses WHEN so avaliadas como TRUE ao tentarmos
categorizar as ordens em uma dessas categorias de valores Categoria_OrdemValor.
Listagem 6. Exemplo onde mltiplas expresses WHEN so 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;

Quando executamos o cdigo presente na Listagem 6 recebemos a sada de acordo com a


Figura 3.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

9 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

Figura 3. Resultado da consulta.


Ao analisarmos os resultados da consulta, podemos ver que cada pedido relatado como
sendo abaixo de 500, e ns sabemos que isso incorreto. Isso aconteceu porque s usamos
o operador de menor que ("<") para classificarmos de forma simplista as Ordens que levam a
mltiplas clusulas WHEN como resultado para serem avaliadas como verdadeiras na
expresso CASE. Porm, a ordenao das clusulas WHEN no permitiu que a expresso
correta fosse retornada. Reordenaremos ento nossas clusulas WHEN para que possamos
obter os resultados da forma que desejamos. O cdigo presente na Listagem 7 o mesmo
que o da Listagem 6, porm, aqui temos as clusulas reordenadas para categorizar
corretamente nossas ordens.
Listagem 7. Pesquisa reordenada para mltiplos resultados.

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'

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

10 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

FROM OrdemServico;

Quando executarmos o cdigo da Listagem 7 receberemos a sada apresentada pela Figura


4.

Figura 4. Resultado ordenado da pesquisa.


Ao analisarmos a sada presente na Figura 4 podemos ver que, alterando a ordem da
clusula WHEN, obtemos os resultados de forma correta para cada ordem, como realmente
deve ser.

Ocasionalmente vocs podem ter a necessidade de executar testes adicionais para


categorizar ainda mais dados usando a expresso CASE. Quando isso ocorre, vocs podem

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

11 de 18

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CONTEDO
REVISTAS
CURSOS
APIs
MVP
LOGIN
de aninhamento para categorizar ainda mais as encomendas na tabela OrdemServico que

para determinar se a ordem foi emitida com o resultado Pago quando uma ordem acima de
R$120,00.
Listagem 8. Declarando um CASE aninhado.

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;

O cdigo apresentado na Listagem 8 semelhante ao que apresentamos na Listagem 7, a


nica diferena que adicionamos uma expresso CASE a mais para ver se um determinado
pedido na tabela OrdemServico foi comprado utilizando a opo Pago ou no, o que s
permitido em compras acima de 300 Reais. Tenham em mente que quando temos expresses
CASE aninhadas, s so permitidos at 10 nveis de aninhamento no SQL Server.

At agora, todos os nossos exemplos usaram expresses CASE para criar uma string de
resultados, colocando a expresso CASE na lista de seleo de uma instruo SELECT do
T-SQL. Tambm podemos usar uma expresso CASE em instrues de UPDATE, DELETE e
instrues do tipo SET. Alm disso, a expresso CASE pode ser usada em conjunto com IN,
WHERE, ORDER BY e HAVING. Na Listagem 9 estaremos usando uma expresso CASE com
uma clusula WHERE.
Listagem 9. CASE com a clausula WHERE.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

12 de 18

CONTEDO

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

REVISTAS

CURSOS

APIs

MVP

LOGIN

SELECT *
FROM OrdemServico
WHERE CASE YEAR(OrdemData)
WHEN 2014 THEN 'Ano 1'
WHEN 2013 THEN 'Ano 2'
WHEN 2012 THEN 'Ano 3'
ELSE 'Ano 4 e posteriores' END = 'Ano 1';

Na Listagem 9 queremos apenas retornar uma ordem da tabela de OrdemServico para


linhas apresentando "Ano 1". Para conseguirmos isso, colocamos a mesma expresso CASE
como foi utilizada na Listagem 3 na clusula WHERE. Usamos ento a expresso CASE como
a parte do lado esquerdo da condio WHERE para que ele produza uma sequncia diferente
de "Ano ..." com base na coluna OrdemData. Testamos ento a string que foi produzida a
partir da expresso CASE para ver se era igual ao valor "Ano 1", em caso positivo, uma linha
seria devolvida a partir da tabela OrdemServico. No recomendamos usar uma expresso
CASE para selecionar a data a partir de uma coluna de data dessa forma, pois existem
melhores mtodos para isso, como por exemplo, usar a funo YEAR para selecionarmos as
linhas de um determinado ano. Fizemos dessa forma apenas para demonstrar como usar uma
instruo CASE com clusulas WHERE.

A partir da verso 2012 do SQL Server, a Microsoft adicionou a funo IIF. A funo IIF pode
ser considerado um atalho para a instruo CASE. Na Listagem 10 podemos encontrar a
sintaxe para a funo IIF.
Listagem 10. Sintaxe da expresso IIF.

IIF ( boolean_expression, true_value, false_value )

O "Boolean_expression" uma expresso booleana vlida que equivale a VERDADEIRO ou


FALSO. Quando a expresso booleana igual a um valor VERDADEIRO, em seguida, a
expresso "true_value" executada. Se a expresso booleana equivale a FALSE ento o
"false_value" executado. Assim como a expresso CASE, a funo IIF pode ser aninhada at
10 nveis.
Para demonstrarmos como a funo IIF pode ser usada para substituir a expresso CASE,
vamos rever o cdigo no qual usamos a expresso CASE searched presente na Listagem 11.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

13 de 18

CONTEDO

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

REVISTAS

CURSOS

APIs

MVP

LOGIN

use Testes;
SELECT OrdemValor,
CASE
WHEN OrdemValor > 200 THEN 'Acima do valor'
ELSE 'Abaixo do valor' END AS OrdemType
FROM OrdemServico;

O cdigo presente na Listagem 11 possui apenas uma nica expresso WHEN que
utilizada para determinar se o OrdemValor uma ordem de alta ou baixa do valor
especificado. Se a expresso WHEN "OrdemValor > 200" for avaliada como TRUE, ento o
valor OrdemType est definido para "Acima do valor". Se a expresso WHEN avaliada como
FALSE ento "Abaixo do valor" ser definido para o valor OrdemType.
O cdigo reescrito da funo que usamos em vez de uma expresso CASE IIF pode ser
encontrado presente na Listagem 12.
Listagem 12. Exemplo utilizando a expresso IIF.

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 funo IIF ser considerada uma
verso abreviada da expresso CASE. A palavra CASE substituda pelo "IIF ("string, a
clusula "ento" substituda por uma vrgula, a clusula "seno" substitudo por uma
vrgula e a palavra "END" substituda por um ")". Quando a expresso booleana
"OrdemValor > 200". verdade que o valor " Acima do valor " exibido. Quando a expresso
booleana 'OrdemValor > 200 " avaliada como FALSE ento o" Abaixo do valor" exibido. Se
executarmos o cdigo presente nas Listagem 11 e 12, veremos que ambos produzem o
mesmo resultado.

Assim como a expresso CASE do SQL Server permite que aninhemos funes IIF. Na
Listagem 13 temos um exemplo de aninhamento com a funo IIF.

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

14 de 18

CONTEDO

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

REVISTAS

CURSOS

APIs

MVP

LOGIN

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 funo IIF vrias vezes. Cada um adicional
usado tanto no "valor verdadeiro" quanto no "valor falso" da funo IIF. O cdigo presente na
Listagem 13 equivalente ao cdigo que usa a expresso CASE aninhada presente na
Listagem 8.

Assim como ocorre com a maioria das funcionalidades presentes no T-SQL, existem limitaes
quanto ao uso das mesmas. Abaixo esto algumas limitaes a serem observadas em relao
ao uso das funes IIF e expresses CASEs.
Limitaes para a expresso CASE
Podemos apenas ter at 10 nveis de aninhamento em suas expresses.
Expresses CASE no podem ser utilizadas para controlar o fluxo de execuo de
instrues T-SQL.
Limitao da funo IIF:

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

15 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

Com isso finalizamos mais este artigo sobre T-SQL, onde mostramos que a expresso CASE e
a funo IIF nos permitem colocar a expresso lgica no cdigo T-SQL que vai mudar os
resultados de nosso cdigo com base nos resultados avaliados de uma expresso. Usando a
expresso de comparao suportada pela funo IIF e a expresso CASE podem ter
diferentes blocos de cdigos executados, dependendo se a expresso de comparao
avaliada como VERDADEIRO ou FALSO. A expresso CASE e a funo IIF nos fornecem o
controle programtico para atender aos requisitos do nosso negcio de forma mais simples e
de fcil utilizao.
At a prxima!

Edson Jos Dionisio


Graduado em Sistemas de informao pela Faculdade Joaquim Nabuco - Recife - PE. Ps - graduando em Banco de
dados Oracle pela Faculdade Maurcio de Nassau - Recife. Trabalho com desenvolvimento de sites e sistemas em
PHP, utiliza [...]

O que voc achou deste post?


Gostei (1)

(0)

Comentrio | Tire sua dvida

Publicidade

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

16 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

Servios
Inclua um comentrio
Adicionar aos Favoritos
Marcar como lido/assistido
Incluir anotao pessoal
Verso para impresso

+Banco de
dados

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

17 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

20/09/2014 19:27

Trabalhando com expresses CASE e a Funo IIF no T-SQL

18 de 18

CONTEDO

REVISTAS

http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...

CURSOS

APIs

MVP

LOGIN

20/09/2014 19:27

Vous aimerez peut-être aussi