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

34 ideias sobre “Função DECODE no Oracle SQL

  1. Eder

    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

    Responder
  2. Bruno

    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?

    Responder
  3. Luiz Segre

    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

    Responder
  4. Carlos

    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?

    Responder
  5. Gustavo

    Olá amigo, boa noite. Estou levantando algumas informações e conto com a sua colaboração como DBA. Quais que tem sido as maiores dificuldades na integração de bancos de dados ? Seria viavel existir uma ferramenta que fizesse essa integração de uma maneira rápida, eficiente e segura ?

    Responder
  6. Reyg

    Muito bom esse post, tirou muitas das minhas dúvidas. Obrigado.
    Só não o post do ‘CASE’, que NOT FOUND. Qualquer novidade nesse post me dê um toque. Valeu.

    Responder
  7. Karen Monteiro

    Preciso muito de uma ajudaaaa!
    Consido usar um Case no From?

    Exemplo: Tenho uma tabela que tem datas de 1 a 31/dez.
    E outra com Id_mês (‘yyyy-mm-01’)

    Quero cruzar assim: Se a data da tabela “A” for de 1 a 18 cruza com o campo id_mes onde for ‘2014-11-01’

    Se for de 19 a 31/dez cruza com o campo id_mes onde for ‘2014-12-01’

    Dá pra fazer isso?

    Não estou acertando a Sintax.

    Responder

Deixe uma resposta

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