DataARTIGO

Utilizando Select Case com MySQL

Olá, pessoal. Neste artigo falaremos sobre um recurso muito utilizado nas linguagens de programação, mas que não é muito conhecido nos bancos de dados, o Select Case.

O Select Case é uma estrutura de controle que realiza as seguintes operações:

  • Avalia-se a expressão, dando como resultado um número.
  • Depois, percorrem-se os “Case” dentro da estrutura procurando que o número coincida com um dos valores.
  • É necessário que coincidam todos os seus valores.
  • Quando se encontra a primeira coincidência, se executa o bloco de sentenças correspondente e se sai da estrutura Select-Case.
  • Se não se encontra nenhuma coincidência com nenhum valor, se executa o bloco de sentenças da secção “Case Else”.

Ou seja:

CASE valor WHEN [valor comparado] THEN resultado [WHEN [valor comparado] THEN resultado <br />...] [ELSE resultado] END, 
CASE WHEN [condição] THEN result [WHEN [condição] THEN resultado <br />...] [ELSE resultado] END

Logo abaixo, seguem dois exemplos de como poderíamos utilizar o Select Case em uma consulta ao banco de dados.

Exemplo 1

Suponhamos que você precise obter os aniversariantes do dia em uma determinada tabela do banco de dados. Porém, o valor que faz referência ao mês de aniversário está armazenado da seguinte maneira: ‘jan’, ‘fev’, ‘mar’, ‘abr’ …

A solução seria:

select distinct *<br />from pessoas<br />where (trim(dia_nascimento) <> "" and trim(mes_nascimento) <> "")<br />and dia_nascimento = date_format(curdate(),'%d')<br />and upper(mes_nascimento) = case date_format(curdate(),'%m') <br />when 01 then 'JAN'<br />when 02 then 'FEV'<br />when 03 then 'MAR'<br />when 04 then 'ABR'<br />when 05 then 'MAI'<br />when 06 then 'JUN'<br />when 07 then 'JUL'<br />when 08 then 'AGO'<br />when 09 then 'SET'<br />when 10 then 'OUT'<br />when 11 then 'NOV'<br />when 12 then 'DEZ'<br />end;

O que fizemos no SQL acima foi utilizar a função curdate() que retorna a data atual no servidor. 

  • Em “date_format(curdate(), ‘%d’)”, formatamos a data atual para recuperar apenas o dia, através do parâmetro ‘%d’.
  • Em “date_format(curdate(), ‘%m’)”, formatamos a data para recuperar apenas o mês. 

O nosso problema é que o formato do mês retornado é numérico e o valor que temos armazenado é texto. Para resolver isso, utilizamos o case para que a partir do mês encontrado ele retorne o valor determinado na condição.

Note que utilizamos trim para eliminar qualquer espaço e upper para deixar o valor referente ao mês em caixa alta.

Exemplo 2

Suponhamos que dependendo do valor que um registro tenha, outros registros da mesma linha precisem ter atribuições diferentes.

Pro exemplo, dependendo do tipo do cliente de uma determinada loja, o valor do adicional aplicado a sua compra será diferente.

Solução:

SELECT c.*,<br />CASE c.tipo_cliente <br />WHEN 'MASTER' THEN (i.valor * (10 / 100)) <br />WHEN 'VIP' THEN (i.valor * (25 / 100))<br />ELSE (i.valor * (35 / 100)) END AS valor_adicional<br />FROM clientes c, item i<br />WHERE 1 = 2

Nesse caso, utilizamos o Select Case para retornar o valor que desejamos cobrar a partir do tipo do cliente.

Caso ele seja ‘MASTER’, o valor adicional será 10% do item comprado; caso ele seja ‘VIP’, será 25% do valor do item comprado; caso ele não seja nenhum dos dois, o valor cobrado será 35% do valor do item.

Espero que tenham gostado. Até a próxima!

Links:

Formado em Análise de Sistemas pela Unibratec (PE) e Pós Graduado em Gerenciamento Ágil de Projetos pelo C.E.S.A.R. Edu (PE). Atualmente trabalha como Analista de Projetos na CSU CardSystem.

Ver perfil