Pular para o conteúdo

Usando CASE no Oracle – SQL

Usando CASE no Oracle – SQL

Fala PessoAll,

Bom, conforme prometido no Post anterior, estou aqui para dar uma apimentada na utilização da função DECODE usando SQL Oracle.

A funcionalidade que iremos falar hoje é a CASE. Esta funcionalidade é muito boa e dá uma dinâmica muito interessante a comandos SQL, em muitas vezes nos poupando de ter que fazer uma Stored Prodecure ou uma Function para fazer alguma coisa que um simples SQL pode resolver.

Para não fugir dos costumes… vamos ao exemplo.

Suponha que você tenha 3 classificações diferentes para seus vendedores, que funcionam da seguinte forma: Se o cara vendeu entre R$0.00 e R$1,000.00 ele é classificado como “Ruim”, se foi entre R$1,001.00 e R$4,000.00 ele é classificado como “Bom”, se foi entre R$4,001.00 e R$8,000.00 ele é classificado como “Ótimo” e se for acima de R$8,001.00 ele é considerado como “Fenomenal”, e você precisa exibir isso no relatório para sua gerência.

Como fazer isso?

Aí você começa a pensar…
DECODE? Não dá… tenho faixa de valores, e não valores específicos!

Cria uma View? Não… uma view é um mero Select, não vai resolver!

Ah…. claro! Cria uma função!!! Na função eu passo o valor que o cara vendeu e ela me retorna qual a classificação do cara! Perfeito!

É…. funcionar vai funcionar, mas você tem que criar um objeto no banco, tem que criar um Script, tem que se preocupar com Grant’s e todos os demais aspectos para que criemos um novo objeto!

Não seria mais simples que no próprio Select a gente resolvesse esse problema? SIM!!! Claro!! Porque não. Para isso, vamos usar a funcionalidade CASE. Como faríamos isso, para este caso?

Agora sim, cenário montado, vamos ao exemplo (de verdade):

select v.nome_vendedor,
       ve.mes,
       ve.vlr_meta,
       ve.vlr_venda,
       case 
          when ve.vlr_venda between 0 and 1000 then
         'Ruim'
          when ve.vlr_venda between 1001 and 4000 then
         'Bom'
          when ve.vlr_venda between 4001 and 8000 then
         'Ótimo'
          when ve.vlr_venda > 8001 then
         'Fenomenal'
      end classificacao_vendedor
from vendedores v,
     vendas     ve
where ve.cod_vendedor = v.cod_vendedor;
and ve.mes          = '07/2009';

Que beleza não? Resolvido nosso provlema! Temos agora em nosso SQL a coluna classificacao_vendedor que nos dá a informação que precisamos, sem problemas com criação de função nem nada do tipo!

Bom não? Simples de usar, rápido e tudo quanto é de vantagem!

É isso aí, creio que a partir desse exemplo dá pra “voar” bem alto! Agora é só adaptar para sua necessidade e tá tudo certo!!

Espero que gostem e comentem!

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

gersonjr

gersonjr

Comentário(s) da Comunidade

  1. Avatar de Adriana

    Olá!

    Muito boa a dica do CASE assim como do DECODE.
    Mas me disseram uma vez que é possível utilizar o CASE também na cláusula WHERE de um Select.
    É possível mesmo? Se sim, como funcionaria?

    Abraços,
    Adriana Arraes.

  2. Avatar de Eduardo Gomes

    Gerson, para esta situação dá pra usar o decode, desde que use também as funções greatest e least.
    Segue um exemplo:
    ?MAIOR
    decode(greatest(valor,10)
    ,10,’então valor é menor ou igual a 10′
    ,’então valor é maior que 10′
    )
    MENOR
    decode(least(valor,10)
    ,10,’então valor é maior ou igual a 10′
    ,’então valor é menor que 10′
    )
    VALOR ENTRE “X” E “Y”
    decode(least(valor,10)
    ,10,decode(greatest(valor,20)
    ,20,’então valor está entre 10 e 20′
    ,’então valor é maior que 20′
    )
    ,’então valor é menor que 10′
    )
    abs,

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress