Você está na página 1de 4

condição no SQL Case

SELECIONE
CASO
QUANDO
Esteja no trabalho
E Tomando um café,
E O chefe não está olhando
ENTÃO
LEIA ESSE ARTIGO AGORA! :P
SENÃO
Aperta um CTRL + D e coloca nos favoritos para ler depois :)
FIM 

Conhecer essa sintaxe inibi consultas redundantes fazendo com que você tenha a
informação disponível imediatamente dentro da aplicação.

Como o ideal é sempre equilibrar as responsabilidades entre banco e aplicação, evitar


centenas de tratativas dentro do loop é uma baita vantagem! Podemos fazer com que o
banco efetue consultas mais elaboradas e que os resultados sejam entregues de forma
mais objetiva para aplicação.

Como sabemos, o PHP é interpretado e não compilado (isso não é lei), portanto, cabe ao
desenvolvedor cuidar da aplicação para não comprometer a agilidade da ferramenta!
Vamos transferir um pouco de responsabilidade para o banco de dados, e usar
algoritmos específicos que foram criados para auxiliar esse tipo de problema!

Obviamente o CASE que vamos tratar nesse artigo, pode ser substituído por um IF no
PHP, mas entregar as informações de uma forma "rústica" para o php e fazer com que
ele faça todas as validações e que isso ainda esteja dentro de um loop sem paginação...

... é pedir para ter problemas num pico de acessos no servidor e acabar com a
experiência que o seu visitante está tendo com o seu site :(

Bora conhecer a sintaxe CASE

Portanto, vamos fazer da seguinte forma: Eu vou te mostrar hoje como é feito o CASE e
como usar tanto na geração de um campo quanto no WHERE do seu SQL!

Observe que não estamos usando nenhuma tabela, nenhum registro em específico! Isso
tem dois motivos:

1) Mostrar como de fato funciona a sintaxe.

2) Forçar com que você crie o seu primeiro CASE (ou não) já dentro da realidade da
sua aplicação.

Vamos ver alguns exemplos práticos na geração de campo:

SELECT
usuario_nome,
CASE
WHEN
usuario_verificado IS NULL
OR usuario_verificado = ''
THEN
'Aluno não Verificado'
ELSE
'Aluno já verificado'
END as verificacao

FROM usuarios

Como dito anteriormente não temos essa tabela criada, mas supondo que temos, note
que estamos consultando os usuários e está sendo retornado duas colunas com
usuario_nome e verificacao.

O nome do usuário obviamente é só para identificação, mas o que conta mesmo é


segunda coluna! Ela só terá dois possíveis valores, ou Aluno não verificado ou Aluno
já verificado. Não há a possibilidade de ter outro para esse campo!

A sintaxe é beeeem tranquila de se trabalhar, agora dentro disso você pode criar N
variações de escritas e usar os testes (boleanos, comparativos ou aritméticos) e utilizar
quantas condições forem necessárias.

Vamos incrementar um pouco mais essa consulta:

SELECT
usuario_nome,
CASE
WHEN
usuario_verificado IS NULL
OR usuario_verificado = ''
THEN
'Aluno não Verificado'

WHEN
usuario_verificado = 'P'
THEN
'Aluno Pendente de Aprovação'

WHEN
usuario_data_cadastro <= '2010-12-31'
THEN
'Usuário Pioneiro'

WHEN
(usuario_verificado = 'X' AND usuario_data_cadastro <=
'2010-12-31')
OR (SELECT bloqueio_status FROM usuarios_bloqueados WHERE
usuario_id = usuarios.usuario_id) = 'BLOQUEADO'
THEN
'Aluno Pioneiro BLOQUEADO'
ELSE
'Não parametrizado'
END as verificacao

FROM usuarios
Óbvio que esses testes são fictícios, mas é só para mostrar como utilizar mais de uma
condição! Veja que fazer o uso constante de AND e OR para montar a estrutura... São
testes lógicos assim como no PHP ou em qualquer outra linguagem de programação.
Nessa sintaxe eu gostaria de frizar os seguintes pontos:

 AND, OR e NOT: São operadores lógicos que você deve combiná-los para
montar seu SQL. Lembre-se que quando utilizar mais de um operador na mesma
consulta, use os parênteses para agrupar e definir a ordem com que deve ser
executada a consulta! Conseguimos notar isso na quarta condição, onde é feito o
uso de AND e o OR... No caso eu faço uma primeira verificação agrupando com
parênteses e depois deste conjunto resolvido, o externo será verificado. Como o
operador lógico OR está por fora do agrupamento, qualquer uma das duas
condições forem satisfeitas, você terá o retorno do respectivo THEN (Aluno
Pioneiro Bloqueado).

 Mais de uma condição: Nesse caso fizemos o uso de 4 condições, sem contar o
ELSE! Você pode adicionar quantas forem necessárias.

 Testes Comparativos e Aritméticos: Quando executamos um WHEN


usuario_verificado = 'P' estamos comparando se o parâmetro desse usuário está
com o valor desejado! Nesse caso estamos fazendo o uso de teste comparativo.
Já na verificação WHEN usuario_data_cadastro <= '2010-12-31' estamos
fazendo um testes aritmético! Estamos analisando se a data dele é menor ou
igual a uma data específica (No caso não efetuamos uma operação aritmética [+,
-, *, \] mas está sendo analisado um determinado período utilizando data, o
mesmo funciona para campos numéricos.)

 Uso do ELSE: Caso nenhuma das condições tenha sido satisfeita, o valor
retornado será o que consta no else! Um ponto a se destacar, é que seu uso é
facultativo... Se necessário, você não precisa informar o bloco do else! Caso
nenhuma condição tenha sido satisfeita o resultado será null.

Imagino que já não deva ser novidade para você que nesse vamos estamos selecionando
TODOS os usuário! Mas e se eu quiser efetura um filtro que tenha somente os usuários
com verificacao 'Aluno Pioneiro' e 'Aluno Pioneiro BLOQUEADO'? Agora que a gente
vai atacar o CASE no WHERE.

SELECT
*

FROM usuarios
WHERE
(CASE
WHEN
usuario_verificado IS NULL
OR usuario_verificado = ''
THEN
'Aluno não Verificado'

WHEN
usuario_verificado = 'P'
THEN
'Aluno Pendente de Aprovação'
WHEN
usuario_data_cadastro <= '2010-12-31'
THEN
'Aluno Pioneiro'

WHEN
(usuario_verificado = 'X' AND usuario_data_cadastro <=
'2010-12-31')
OR (SELECT bloqueio_status FROM usuarios_bloqueados WHERE
usuario_id = usuarios.usuario_id) = 'BLOQUEADO'
THEN
'Aluno Pioneiro BLOQUEADO'
ELSE
'Não parametrizado'
END) IN ('Aluno Pioneiro', 'Aluno Pioneiro BLOQUEADO')

Você deve ter notado como foi simples usar no WHERE e filtrar somente alguns
registros! Vamos para ressalvas:

 O CASE é exatamente o mesmo usado do exemplo acima.

 Todo o CASE foi envolvido por parênteses para agrupar o bloco. (Funcionaria
sem os parênteses, mas o SGDB teria que "descobrir" isso! Você pode
simplesmente passar os parênteses para avisar ao SGDB e o ganho de
performance disso é extremamente significativo... Óbvio que em banco pequeno
isso não surtirá efeitos, mas em bancos de dados grandes isso é essencial! Bora
acostumar trabalhar nesse formato então).

 Não tem alias. Depois do END não existe mais o "as verificacao".

O CASE não tem somente esse formato de escrita, mas assim na minha opinião é a
sintaxe mais confortável para se trabalhar.

Me conte aqui nos comentários, se você já conhecia ou não o CASE e se já aplica em


seus projetos... E ainda, você pode sugerir assuntos para as próximas postagens.

Você também pode gostar