UpInside Treinamentos

Trabalhando com CASE, WHEN, THEN, ELSE, END no MariaDB

Aplique essa sintaxe nas suas queries e entregue a informação para sua aplicação de maneira mais resumida e poupe processamento no loop do seu PHP.

Trabalhando com CASE, WHEN, THEN, ELSE, END no MariaDB
  • Compartilhe esse post
  • Compartilhar no Facebook00
  • Compartilhar no Google Plus00
  • Compartilhar no Twitter

Salve salve webmaster, hoje o nosso assunto é sobre condição no SQL!

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.

  • Compartilhe esse post
  • Compartilhar no Facebook00
  • Compartilhar no Google Plus00
  • Compartilhar no Twitter

Olá, deixe seu comentário para Trabalhando com CASE, WHEN, THEN, ELSE, END no MariaDB

Já temos 14 comentário(s). DEIXE O SEU :)
João pedro Ferreira coelho

João pedro Ferreira coelho

Fiz uma consulta composta pra exibis os posts com número de comentários.
Usei esses parâmetros para a própria consulta imprimir Nenhum Comentário, 1 Comentário ou 2 Comentários e assim por diante.
★★★★★DIA 14.04.17 19h17RESPONDER
N/A
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

Muuuuito bom! Isso ai, primeira aplicação saindo do forno já com CASE diretamente no banco de dados :)

★★★★★DIA 17.04.17 16h25RESPONDER
João pedro Ferreira coelho
Enviando Comentário Fechar :/
Ruthnaldo Garrido

Ruthnaldo Garrido

Maravilha, cada vez melhor
Parabéns!
★★★★★DIA 29.03.17 21h14RESPONDER
Gustavo Web
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

:) Tmj

★★★★★DIA 30.03.17 11h01RESPONDER
N/A
Enviando Comentário Fechar :/
Marcio Sales

Marcio Sales

Show.. Show.. Previsão pro Curso de BD?
★★★★★DIA 29.03.17 20h55RESPONDER
Gustavo Web
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

Até o momento ainda não! Mas será bem em breve, provavelmente vamos lançar já dentro do club.

★★★★★DIA 30.03.17 11h00RESPONDER
Renan Lheureux Abraham Antunes De Oliveira
Enviando Comentário Fechar :/
Magno Pinheiro #eadcontrol

Magno Pinheiro #eadcontrol

SELECT
Gustavo Web,
CASE
WHEN
club IS 1

THEN
'Curso de Bancos de Dados Online'
ELSE
'Em breve teremos o curso'
END as verificacao

FROM alunos
★★★★★DIA 29.03.17 16h06RESPONDER
Gustavo Web
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

Quase isso Magno :)


O Gustavo Web tem que estar entre apóstrofos ('Gustavo Web') e o no club tem que ser = ao invés de IS. Feito isso deve funcionar legal sua query =P

★★★★★DIA 29.03.17 16h40RESPONDER
Magno Pinheiro #eadcontrol
Enviando Comentário Fechar :/
Guilherme augusto Teixeira de matos

Guilherme augusto Teixeira de matos

Agora vejo que ainda tem muito chão para percorrer para então ser um profissional completo! (=
Precisando urgente do curso de banco de dados! kkkkk
Parabéns pelo artigo, abriu minha mente para muitas outras coisas!
★★★★★DIA 29.03.17 12h42RESPONDER
Gustavo Web
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

Maaasssaaaa demais! Sim, banco de dados é um conteúdo muuuito vasto e teremos muito conteúdo. Vai aplicando as tecnicas que você vê aqui e sua aplicação vai ficando cada vez mais otimizada.

★★★★★DIA 29.03.17 14h27RESPONDER
Guilherme augusto Teixeira de matos
Enviando Comentário Fechar :/
Carlos Alberto Camargo Da Silva

Carlos Alberto Camargo Da Silva

Excelente! Não sabia dessas possibilidades. clareou a sala toda aqui, hahaha. Fico imaginando o nível top, que vai ter esse treinamento de Banco de Dados!
★★★★★DIA 29.03.17 12h04RESPONDER
Gustavo Web, Magno Pinheiro #eadcontrol
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

E tem conteúdo heeein! O curso será exclusivo dentro do club :)


Bora botar isso em prática dentro das suas aplicações.

★★★★★DIA 29.03.17 14h26RESPONDER
Carlos Alberto Camargo Da Silva, Magno Pinheiro #eadcontrol
Enviando Comentário Fechar :/
Cesar Moreira Borges

Cesar Moreira Borges

Show! Poderia rolar um curso de BD!
★★★★★DIA 29.03.17 11h19RESPONDER
Gustavo Web
Enviando Comentário Fechar :/
Gustavo Web

Gustavo Web

Vai rolar sim! Bem em breve :)


Fica de olho que será um dos primeiros cursos do club!

★★★★★DIA 29.03.17 13h37RESPONDER
Carlos Alberto Camargo Da Silva, João pedro Ferreira coelho
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/