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
...] [ELSE resultado] END,
CASE WHEN [condição] THEN result [WHEN [condição] THEN resultado
...] [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 *
from pessoas
where (trim(dia_nascimento) <> "" and trim(mes_nascimento) <> "")
and dia_nascimento = date_format(curdate(),'%d')
and upper(mes_nascimento) = case date_format(curdate(),'%m')
when 01 then 'JAN'
when 02 then 'FEV'
when 03 then 'MAR'
when 04 then 'ABR'
when 05 then 'MAI'
when 06 then 'JUN'
when 07 then 'JUL'
when 08 then 'AGO'
when 09 then 'SET'
when 10 then 'OUT'
when 11 then 'NOV'
when 12 then 'DEZ'
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.*,
CASE c.tipo_cliente
WHEN 'MASTER' THEN (i.valor * (10 / 100))
WHEN 'VIP' THEN (i.valor * (25 / 100))
ELSE (i.valor * (35 / 100)) END AS valor_adicional
FROM clientes c, item i
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:
-
Funções de Fluxo de Controle – http://dev.mysql.com/doc/refman/4.1/pt/control-flow-functions.html
- Date and Time Functions – http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_date-format
-
MySQL 5.5 – http://dev.mysql.com/