Programação / Banco de Dados

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.

Por Gustavo Web

Publicado por Gustavo Web
em 29/03/2017 às 10h18

Lista VIP UpInside

Entre para nossa lista VIP e receba vídeo aulas, artigos e tutoriais exclusivos e com prioridade

  QUERO ENTRAR
Compartilhe:

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:

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 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:

Em Programação:

Deixe seu comentário: