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”.

Sintaxe:

CASE valor
[valor comparado] THEN resultado [WHEN [valor comparado] THEN resultado
...] [ELSE resultado] END

Exemplo 1:

No caso a baixo, o campo chamado Status está preenchido com "A", "F" ou "E".

Para cada condição é proposto um valor de saída final; veja:

select

case status

when 'A' then 'Aberto'

when 'F' then 'Fechado'

when 'E' then 'Em Andamento'

End as Status

from

agenda

order by id desc


Sendo assim, quando o campo status estiver preenchido com "A" será mostrado "Aberto", "F" mostrará "Fechado" e "E" em andamento.

Exemplo 2:

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


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.

0 comentários:

Postar um comentário

 
Top