No Oracle, a função DECODE nos permite adicionar lógica procedural if-then-else à consulta. Neste blog, tentaremos obter uma compreensão completa da função DECODE no SQL. Estaremos aprendendo as várias maneiras de usar o DECODE, sua sintaxe e entendê-lo com exemplos. Fique conosco até o final do blog.
Os tópicos que serão abordados são:
- O que é a função DECODE em SQL?
- A sintaxe da função DECODE
- Exemplos da função DECODE
Vamos começar um por um.
O que é a função DECODE no SQL?
No Oracle, a função DECODE nos permite adicionar lógica procedural if-then-else à consulta. DECODE compara a expressão a cada valor de pesquisa um por um. Se expressão for igual a uma pesquisa, o resultado correspondente será retornado pelo Banco de Dados Oracle. Se uma correspondência não for encontrada, o padrão será retornado. Se o padrão for omitido, o Oracle retornará nulo.
O tipo de argumentos pode ser:
- Tipos numéricos (NUMBER, BINARY_FLOAT ou BINARY_DOUBLE)
Se o primeiro par de resultados de pesquisa for numérico, o Oracle compara todas as expressões de resultados de pesquisa e a primeira expr para localizar o argumento com a precedência numérica mais alta, converte os argumentos restantes implicitamente para esse tipo de dados e retorna esse tipo de dados específico.
- Tipos de caracteres
Se expr e search forem dados de caracteres, o Oracle os comparará usando semântica de comparação não preenchida. expr, search e o resultado pode ser qualquer um dos tipos de dados CHAR, VARCHAR2, NCHAR ou NVARCHAR2. A String retornada é do tipo de dados VARCHAR2 e está no mesmo conjunto de caracteres que o primeiro parâmetro de resultado.
O banco de dados Oracle usa avaliação de curto-circuito. Ele avalia os valores de pesquisa apenas antes de compará-lo com a expressão, em vez de avaliar todos os valores de pesquisa. Se uma pesquisa anterior for igual a expressão, a avaliação é encerrada.
O Oracle converte os valores expr e search para o tipo de dados do primeiro valor de pesquisa antes da comparação. E converte o valor de retorno para o mesmo tipo de dados que o primeiro resultado.
Exemplo: Se o primeiro resultado tiver o tipo de dados CHAR ou se o primeiro resultado for nulo, o Oracle converterá o valor de retorno no tipo de dados VARCHAR2.
Dois nulos são considerados equivalentes pela Oracle. Se expr for nulo, o Oracle retornará NULL, que é o resultado da primeira pesquisa.
O número máximo de componentes que podem estar contidos na função DECODE é 255. Isso inclui os argumentos de expressão, pesquisa e resultado.
A função DECODE pode ser usada nas seguintes versões do Oracle ou PLSQL:
Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i
Um exemplo básico:
No exemplo a seguir, a função Oracle DECODE() compara o primeiro argumento com o segundo argumento. Como eles são iguais, a função retorna o segundo argumento que é a string ‘One’.
SELECT DECODE(1, 1, 'One') FROM dual;
A sintaxe da função DECODE é:
DECODE(expressão , pesquisa , resultado [, pesquisa , resultado]… [, padrão(opcional)])
expressão
O valor que deve ser comparado. Ele é convertido automaticamente para o tipo de dados do primeiro valor de pesquisa antes de comparar.
pesquisar
O valor que é comparado com a expressão.
resultado
O valor retornado, se expressão=pesquisa.
padrão
Se não houver correspondências, a função DECODE retornará o padrão e, se o padrão for omitido, a função retornará NULL.
Exemplos da função DECODE
- A função DECODE pode ser usada no Oracle/PLSQL da seguinte forma
SELECT bank_name, DECODE(bank_id, 001, 'SBI', 002, 'ICICI', 003, ‘Dena', 'Gateway') result FROM banks;
Instrução IF-THEN-ELSE equivalente para a instrução DECODE() acima:
IF bank_id = 001 THEN result := 'SBI'; ELSIF bank_id = 002 THEN result := 'ICICI'; ELSIF bank_id = 003 THEN result := 'Dena'; ELSE result := 'Gateway'; END IF;
A função DECODE irá comparar cada valor bank_id, um por um.
- Função DECODE para comparar duas datas (data1 e data2), onde, se data1> data2, a função DECODE deve retornar data2. Caso contrário, a função DECODE deve retornar date1
DECODE((date1 - date2) - ABS(date1 - date2), 0, date2, date1)
A fórmula abaixo é igual a 0, se data1 for maior que data2:
(date1 - date2) - ABS(date1 - date2)
O exemplo de data ilustrado acima também pode ser modificado da seguinte forma:
DECODE(SIGN(date1-date2), 1, date2, date1)
- Instrução DECODE que retornará o seguinte:
Se horas_de_trabalho <1, retorne 0,04
Se hours_of_work>=1 e <5, então retorne 0,04
Se hours_of_work> 5, então retorne 0,06
Aqui, você precisa criar uma fórmula que será avaliada em um único número para cada um de seus intervalos.
SELECT emp_name, DECODE(TRUNC (( hours_of_work + 3) / 4), 0, 0.04, 1, 0.04, 0.06) as perc_value FROM employees;
Isso é tudo sobre a função DECODE, agora você deve ter uma ideia clara de como ela funciona e quão útil é essa função. Agora, tente usá-los sempre que qualquer lógica IF-ELSE for necessária ao trabalhar no SQL. Espero que o artigo tenha ajudado você com os conceitos da instrução DECODE.
Se você deseja aprender mais sobre o MySQL e conhecer esse banco de dados relacional de código aberto, confira nosso Treinamento de certificação de DBA MySQL que vem com treinamento ao vivo conduzido por instrutor e experiência de projeto na vida real. Este treinamento ajudará você a entender o MySQL em profundidade e a dominar o assunto.
Tem alguma pergunta para nós? Mencione-o na seção de comentários de "DECODE in SQL" e eu entrarei em contato com você.