Académique Documents
Professionnel Documents
Culture Documents
1 de 18
CONTEDO
comentrios
REVISTAS
http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
CURSOS
APIs
MVP
LOGIN
Curtir
16
DevMedia
Curtir
20/09/2014 19:27
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.
20/09/2014 19:27
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.
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
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
5 de 18
CONTEDO
REVISTAS
http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
CURSOS
APIs
MVP
LOGIN
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
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.
20/09/2014 19:27
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'
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
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;
20/09/2014 19:27
9 de 18
CONTEDO
REVISTAS
http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
CURSOS
APIs
MVP
LOGIN
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
10 de 18
CONTEDO
REVISTAS
http://www.devmedia.com.br/trabalhando-com-expressoes-case-e-a-fu...
CURSOS
APIs
MVP
LOGIN
FROM OrdemServico;
20/09/2014 19:27
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'
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
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';
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.
20/09/2014 19:27
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
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
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
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!
(0)
Publicidade
20/09/2014 19:27
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
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
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