Função DECODE no Oracle SQL

Fala PessoAll,

Hoje vamos falar de Construção de SQL.

As vezes precisamos fazer umas coisas mais avançadas num comando SQL e aí precisamos utilizar alguns recursos mais interessantes que o Oracle nos proporciona.

Quem nunca pensou: “Ai como seria bom se tivesse um IF no select”. Tem sim!

O primeiro recurso que podemos utilizar é o DECODE, essa função é bem interessante e quebra um bocado de galhos, vamos ver um exemplo pra “clarear” as idéias.

Suponha que você tem uma tabela que contém o sexo das pessoas, mas na tabela só armazena F ou M e você quer que seja mostrado “Masculino” e “Feminino” no retorno do seu select, como fazemos isso no select? Com DECODE!

Assim:


select nome,
dt_nascimento,
decode(sexo,
'M', 'Masculino',
'F', 'Feminino',
'Indefinido') sexo
from pessoas;

Como funciona isso… o DECODE testa o valor que você passa no primeiro parâmetro e vai comparando com o que você especifica e retorna o que você deseja. Complexo não? NÃO!! Vamos explicar o nosso exemplo:

No exemplo acima é passado o campo sexo, em seguida passamos o primeiro valor de teste e o que vai retornar caso encontre este valor, que neste caso é: Se encontrar 'M' retorne 'Masculino', sempre aos pares. Ou seja, valor encontrado e logo depois o valor que vai retornar. Como podemos ver, depois vem mais um par… 'F' e 'Feminino' o que nos diz que se encontrar um 'F', traga 'Feminino' na coluna.

Tá, mas e esse último valor que tem 'Indefinido'? Ele não tem par!! Vai dar erro? Não, esse é uma espécie de ELSE do DECODE… se ele não encontrar nenhuma das alternativas passadas para retornar um valor especificado, ele retorna esse último valor. No nosso exemplo, podemos ver que caso não encontre 'M' nem 'F' no campo, ele irá retornar o valor 'Indefinido' para a coluna… agora ficou claro!

O DECODE não tem um limite mínimo nem máximo de “pares de teste e retorno”, você pode ir especificando os valores e os retornos de acordo com sua necessidade.

Bom, esse é um recurso do Oracle que pode ser bem útil para pessoas que fazem SQL, que elaboram relatórios, que vivem fazendo query entre outros casos.

Como podemos verificar, para usar o DECODE nós temos que saber os valores que estão na coluna para que possamos informar qual o retorno caso determinado valor seja encontrado, mas… e se eu quiser utilizar uma faixa de valores por exemplo? Tipo… se coluna nota estiver entre 0 e 3 retorno 'Péssimo', entre 4 e 5 retorne 'Ruim', entre 6 e 8 retorne 'Bom' e acima de 8 retorne 'Ótimo'? Não dá pra fazer isso com DECODE né? Mas, tenha calma… no próximo post falaremos sobre uma outra função do Oracle que é uma espécie de DECODE avançado, que permite esse tipo de teste e muito mais.

Espero que gostem e que seja útil. Até a próxima.

Não exitem em comentar e/ou mandar e-mails.

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

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

22 Comments »

 
  • Anonymous says:

    Cara, que função misteriosa é essa? Preciso usar faixas de valores!
    Pesquisei no google e caí aqui.
    Blog bacana a proposito!

  • Gerson Júnior says:

    Caro Anônimo…

    A função a que me refiro é a função CASE.

    Dá uma olhada no post Usando Case no Oracle SQL que deve resolver teu problema!

    PS: Nas próximas vezes faz login antes de comentar, assim fica mais fácil responder. Ou, deixa teu e-mail.

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

  • Rafael Boarotto says:

    Cara, muito bom este post sobre o Decode, esclareceu todas as minhas dúvidas.

  • Ricks says:

    Muito bom, parabéns pelo post!!!

  • Felthes says:

    Cara, muito bom,
    vc detalhou de uma forma q ficou muito claro.

    Obrigado.

  • Rafael Sousa says:

    Além de comentar sobre um assunto interessante o artigo foi muito bem escrito.
    Parabéns!

  • Carlos says:

    Muito bom o post, a explicação foi passada de forma clara e com bastante facilidade de entendimento. Parabens!!

  • Ricardo Ramos says:

    Muito bom. Bem Claro a explicação. Continue sempre postando.

  • Felipe says:

    Excelente post, muito bem explicado.

  • Aluysio says:

    Obrigado pela contribuição; Elucidativa e clara.
    Parabéns ao seu trabalho no Blog

  • Eder says:

    Olá,
    Primeiramente parabéns, cara tem dois dias eu tentando entender com funcionava extamente o DECODE, poxa depois q vir seu post.. putzzz… Muito fácillllllllllll…
    Perfeita explicação, simples e esclarecedores..
    Já add seu post aos favoritos do meu navegador.. rsrs
    Abraço

  • Su says:

    muito bom! entendi perfeitamente!

    obrigada!

  • Bruno says:

    Valioso post, resolveu muitas dúvidas minhas, mas queria so uma informação, é possivel eu usar este decode para por exemplo decidir qual campo vou pesquisar na tabela? Tenho uma query que ficaria melhor se eu passasse por parametro qual campo sera pesquisado tem como fazer isso utilizando o decode?

    • oracle says:

      Tem sim cara. é da mesma forma.

      select decode(parametro, 1, campo1, 2, campo2, campo3) from tabela;

      Isso é mais ou menos algo assim: Se o parametro for 1, pegue o campo 1, se for 2, pegue o campo2, senão, pegue o campo 3.

      Abraço!!

      Gerson S. de Vasconcelos Júnior
      OCA DBA – Oracle Certified Associate
      Fone: (81) 9816-0236
      Msn: gerson.vasconcelos@gmail.com
      Skype: gersonvjunior
      http://www.diaadiaoracle.com.br/

  • Tácito says:

    Muito bom. Excelênte post.

  • Luiz Segre says:

    Parabéns pelo site, muito bom!

    Gostaria de acrescentar uma informação, é possível informar faixa de valores sim, segue:

    decode(greatest(valor, 0), least(valor, 999999), 1, 0)

    Retorna “1″ se estiver entre 1 e 999998

    Abraço

  • Carlos says:

    Primeiramente, parabens pelo post, bastante simples, porém muito elucidativo.
    Estou com o seguinte problema, tenho dois campos, “oferta” e “preço”
    gostaria de fazer o seguinte, “se a oferta for > 0 então pegue o campo oferta, caso contrario, pegue o campo preço” seria o caso de utilizar o Decode, ou teria algum comando mais especifico?

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>