Pular para o conteúdo principal
InicioTutoriaisSQL

Entendendo a função SQL DECODE()

Saiba como usar DECODE() no Oracle para lógica condicional na transformação de dados. Compare DECODE() com a instrução CASE WHEN em termos de desempenho e comportamento.
Actualizado ago. de 2024  · 11 min leer

Entender como implementar a lógica condicional diretamente nas consultas SQL é uma habilidade necessária para analistas de dados, cientistas e engenheiros. Este tutorial fornece um guia abrangente para você usar a função SQL DECODE() no Oracle. Também compararei DECODE() com CASE WHEN no Oracle e ajudarei você a entender quando usar cada função. Por fim, fornecerei o código para as transformações equivalentes no SQL Server, PostgreSQL e MySQL. 

Antes de vermos os exemplos práticos, recomendo que você faça o curso Introduction to Oracle SQL da DataCamp para atualizar suas habilidades no uso do dialeto PL/SQL. Além disso, nosso curso de SQL intermediário equipará você com as habilidades avançadas de SQL necessárias ao lidar com consultas com a função DECODE() porque, como veremos, DECODE() é frequentemente usado com sintaxe mais avançada, como subconsultas.

Como usar a função SQL DECODE()

A função SQL DECODE() tem suporte nativo no banco de dados Oracle e está disponível no dialeto PL/SQL. A função DECODE() permite a implementação de lógica condicional na consulta. Essa técnica é importante porque ajuda na transformação de dados ao recuperar registros do banco de dados.

Considere a tabela employees abaixo, onde o department_id tem valores numéricos. Em vez disso, queremos que o site department_id seja chamado de department_name e tenha categorias mais compreensíveis.

Exemplo de tabela a ser transformada usando a função SQL DECODE()

Exemplo de tabela para você transformar usando a função SQL DECODE(). Imagem do autor.

O exemplo abaixo mostra como você pode usar a função DECODE() para transformar o department_id em nomes reais.

-- Using DECODE to transform department_id to department_name
SELECT 
    employee_id,
    first_name,
    last_name,
    DECODE(department_id, 
        1, 'IT', 
        2, 'HR', 
        3, 'Finance', 
        4, 'Marketing', 
        5, 'Sales', 
        'Unknown') AS department_name,
    salary,
    hire_date,
    city
FROM employees;

Exemplo de saída de tabela transformada usando a função SQL DECODE()

Exemplo de tabela de saída após você usar a função SQL DECODE(). Imagem do autor.

Entendendo a função SQL DECODE()

A função DECODE() está disponível no banco de dados Oracle e permite que você transforme uma coluna usando lógica condicional. A função DECODE() permite várias transformações condicionais usando uma consulta simples.

A sintaxe da função DECODE() é mostrada abaixo:

DECODE(expression, search1, result1, search2, result2, ..., default)

Onde:

  • expression: O valor a ser comparado.

  • search: O valor a ser comparado com a expressão.

  • result: O valor retornado se a expressão corresponder ao valor da pesquisa.

  • default: O valor retornado se nenhuma correspondência for encontrada (opcional).

Técnicas e considerações avançadas com a função SQL DECODE()

Algumas operações SQL avançadas podem ser realizadas com a função DECODE(). As técnicas avançadas permitem uma transformação lógica condicional mais complexa. 

DECODE() com funções agregadas

A função DECODE() no Oracle pode ser usada na instrução SELECT para recategorizar uma variável e também pode ser usada na instrução SELECT com funções agregadas para um agrupamento mais complicado, o que melhora ainda mais a flexibilidade e a interpretação dos resultados. 

Na consulta a seguir, usamos DECODE() para transformar department_id em department_name. Também usamos o site DECODE() para categorizar o salário médio em "Alta remuneração" ou "Baixa remuneração".

SELECT 
    department_id,
    
    -- Use DECODE to transform department_id into department_name
    DECODE(
        department_id,
        1, 'IT', 
        2, 'HR', 
        3, 'Finance', 
        4, 'Marketing', 
        5, 'Sales', 
        'Unknown'
    ) AS department_name,
    
    SUM(salary) AS total_salary, 
    
    -- Calculate the average salary for each department and round to nearest integer
    ROUND(AVG(salary), 0) AS average_salary,
    
    -- Use DECODE to categorize average salary into 'High Paying' or 'Low Paying'
    DECODE(
        SIGN(AVG(salary) - 65000), 
        1, 'High Paying', 
        0, 'High Paying', 
        -1, 'Low Paying' 
    ) AS salary_category
FROM 
    employees
GROUP BY 
    department_id; 

Exemplo de saída de tabela após o uso de várias funções SQL DECODE()

Exemplo de saída de tabela após o uso de várias funções SQL DECODE(). Imagem do autor

Instruções DECODE() aninhadas

A implementação da função DECODE() com subconsultas permite que você realize transformações sofisticadas de lógica condicional nos dados. A instrução DECODE() aninhada no Oracle ajuda quando você deseja avaliar várias condições em uma tabela.

No exemplo abaixo, usamos a instrução DECODE() aninhada para categorizar os funcionários com base em seu departamento e salário.

-- Select the columns
SELECT 
    employee_id,
    first_name, 
    last_name, 
    department_id,
    salary, 
    
    -- Use DECODE to categorize salary based on department and salary thresholds
    DECODE(department_id,
        
        1, DECODE( -- If department_id is 1 (IT)
            CASE 
                WHEN salary > 65000 THEN 'High' 
                ELSE 'Low' 
            END, 
            'High', 'IT High Salary', 
            'Low', 'IT Low Salary' 
        ),
        
        2, DECODE( -- If department_id is 2 (HR)
            CASE 
                WHEN salary > 55000 THEN 'High'
                ELSE 'Low' 
            END, 
            'High', 'HR High Salary', 
            'Low', 'HR Low Salary' 
        ),
        
        3, DECODE( -- If department_id is 3 (Finance)
            CASE 
                WHEN salary > 70000 THEN 'High' 
                ELSE 'Low' 
            END, 
            'High', 'Finance High Salary', 
            'Low', 'Finance Low Salary' 
        ),
        
        4, DECODE( -- If department_id is 4 (Marketing)
            CASE 
                WHEN salary > 68000 THEN 'High'
                ELSE 'Low' 
            END, 
            'High', 'Marketing High Salary', 
            'Low', 'Marketing Low Salary' 
        ),
        
        5, DECODE( -- If department_id is 5 (Sales)
            CASE 
                WHEN salary > 60000 THEN 'High' 
                ELSE 'Low'  
            END, 
            'High', 'Sales High Salary', 
            'Low', 'Sales Low Salary'
        ),
        
        'Unknown Department' -- Default value if department_id does not match any case
    ) AS salary_category
FROM 
    employees;

Exemplo de saída de tabela ao usar a instrução DECODE() aninhada do SQL no Oracle

Exemplo de saída de tabela após você usar a função DECODE() aninhada. Imagem do autor

Como DECODE() lida com valores NULL

A função DECODE() também trata os valores de NULL de duas maneiras diferentes. Por um lado, DECODE() age como se dois valores NULL fossem equivalentes. Essa funcionalidade significa que os valores de NULL são considerados uma correspondência quando você compara os valores da coluna com NULL. Ainda assim, você deve ficar atento a resultados inesperados quando o NULL não for explicitamente considerado, pois ele pode mascarar os valores do NULL durante a transformação.

Além disso, você deve saber que, assim como a instrução CASE WHEN, a função DECODE() retorna um valor NULL se nenhuma correspondência for encontrada.

O exemplo abaixo mostra como a função DECODE() retorna valores nulos quando department_id e salary estão ausentes.

-- Select columns
SELECT 
    employee_id,
    first_name,
    last_name, 
    department_id, 
    salary, 
    -- Determine the salary category based on the salary value
    DECODE(salary, 
        NULL, 'No Salary Information',
        60000, 'Standard Salary',
        'Other Salary') AS salary_category, 
    -- Determine the department name based on the department ID
    DECODE(department_id, 
        1, 'IT',
        2, 'HR',
        3, 'Finance',
        4, 'Marketing',
        5, 'Sales') AS department_name 
        -- If department_id does not match any of the above, return NULL
FROM 
    employees;

Exemplo de saída de tabela usando a função SQL DECODE() para lidar com valores NULL.

Exemplo de saída de tabela após você usar DECODE() para lidar com valores NULL. Imagem do autor

DECODE vs. CASE WHEN no Oracle

A função DECODE() foi a primeira a ser introduzida e, embora tenha sido substituída pela declaração CASE WHEN, ela ainda é preferida em alguns contextos. Por exemplo, a sintaxe da função DECODE() é mais simples, portanto, se a lógica for bastante simples, será mais fácil de ler e entender. 

Além disso, a função DECODE() geralmente é mais rápida, pois seu desempenho foi otimizado como uma função incorporada, embora a diferença possa ser insignificante. Por fim, em sistemas Oracle legados, talvez você precise usar a função DECODE() como função interna. 

Alternativas ao DECODE() em outros bancos de dados

A função DECODE() só é compatível com o banco de dados Oracle. No entanto, o SQL Server, o PostgreSQL e o MySQL oferecem métodos alternativos para aplicar a lógica de transformação de dados condicionais.

A função DECODE() é útil na transformação de dados, pois simplifica a lógica complexa ao eliminar o uso de instruções IF ELSE ou CASE. A função DECODE() também melhora a legibilidade da consulta, permitindo a manipulação eficiente dos dados. Vamos examinar os diferentes casos de uso da função DECODE().

Usando CASE WHEN no SQL Server, PostgreSQL e MySQL

A instrução CASE WHEN oferece uma alternativa à função DECODE() para executar a transformação da lógica condicional do SQL. A sintaxe e a implementação do CASE WHEN são consistentes nos bancos de dados SQL Server, PostgreSQL e MySQL.

O exemplo abaixo mostra como você pode usar a instrução CASE WHEN para transformar dados na instrução SELECT. A consulta também mostra como você pode combinar a instrução CASE WHEN com outras funções SQL para obter uma transformação condicional complexa.

 -- Select department ID
SELECT 
    department_id,
    
    -- Use CASE to transform department_id into department_name
    CASE 
        WHEN department_id = 1 THEN 'IT'
        WHEN department_id = 2 THEN 'HR'
        WHEN department_id = 3 THEN 'Finance'
        WHEN department_id = 4 THEN 'Marketing'
        WHEN department_id = 5 THEN 'Sales'
        ELSE 'Unknown' 
    END AS department_name,
    
    SUM(salary) AS total_salary,
    
    -- Calculate the average salary for each department and round to the nearest whole number
    ROUND(AVG(salary), 0) AS average_salary,
    
    -- Use CASE to categorize average salary into 'High Paying' or 'Low Paying'
    CASE 
        WHEN AVG(salary) > 65000 THEN 'High Paying'
        ELSE 'Low Paying' 
    END AS salary_category
FROM 
    employees
GROUP BY 
    department_id; -- Group results by department ID   

Conclusão e aprendizado adicional

Entender a função Oracle DECODE() é importante para que você aprenda a transformar dados de forma eficaz. A função DECODE() oferece vários casos de uso para aplicação de lógica condicional durante a transformação de dados. Também é importante que você aprenda a transformação condicional alternativa nos bancos de dados SQL Server, PostgreSQL e MySQL. Recomendo que você pratique a função DECODE() usando diferentes conjuntos de dados e casos de uso para aperfeiçoar suas habilidades de transformação de dados.

Se você deseja aprimorar suas habilidades de análise de dados, recomendo que faça o curso Reporting in SQL da DataCamp para desenvolver suas habilidades de análise e apresentação. Da mesma forma, você deve conferir nosso programa de carreira Associate Data Analyst in SQL para ajudá-lo a manter o progresso do SQL necessário em sua carreira como analista de dados. Por fim, recomendo enfaticamente que você participe do projeto DataCamp's Data-Driven Decision Making in SQL para demonstrar que domina o uso de diferentes técnicas de SQL para análise e geração de relatórios e se destacar entre outros analistas de dados.

Perguntas frequentes

O que é a função SQL DECODE()?

O SQL DECODE() é uma função usada para executar a lógica condicional para a transformação de dados.

Quais bancos de dados são compatíveis com a função SQL DECODE()?

Somente o banco de dados Oracle suporta nativamente a função SQL DECODE(). O SQL Server, o PostgreSQL e o MySQL permitem a transformação condicional usando a instrução CASE WHEN.

Posso usar DECODE() com outras funções SQL?

A função Oracle DECODE() pode ser usada com outras funções SQL, como AVG(), SUM() e COUNT(), para realizar transformações condicionais avançadas.

Posso usar instruções DECODE() aninhadas?

Os bancos de dados Oracle suportam instruções DECODE() aninhadas para lógica complexa. No entanto, declarações DECODE() aninhadas mais longas podem se tornar difíceis de manter e ler.

A função DECODE() pode manipular valores NULL?

A função DECODE() trata os valores de NULL como padrão e retornará os valores de NULL se a condição não for atendida durante a transformação de dados.

Além de DECODE(), quais outras funções são exclusivas do Oracle?

Outras funções exclusivas do banco de dados Oracle incluem NVL(), que substitui os valores de NULL pelos valores especificados.

Temas

Aprenda SQL com a DataCamp

Course

Introduction to Oracle SQL

4 hr
11.9K
Sharpen your skills in Oracle SQL including SQL basics, aggregating, combining, and customizing data.
See DetailsRight Arrow
Start Course
Ver maisRight Arrow
Relacionado

tutorial

Função SQL COALESCE

COALESCE() é uma das funções mais úteis do SQL. Leia este tutorial para saber como dominá-lo.
Travis Tang 's photo

Travis Tang

4 min

tutorial

FUNÇÃO SQL FORMAT()

FORMAT() é uma das funções mais comumente usadas no SQL. Aprenda suas principais aplicações neste tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

FUNÇÃO SQL COUNT()

COUNT() permite que você conte o número de linhas que correspondem a determinadas condições. Saiba como usá-lo neste tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

FUNÇÃO SQL DATEDIFF()

DATEDIFF() é uma das funções de manipulação de dados de data mais usadas no SQL. Domine-o lendo este tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

QUALIFICAR: A instrução de filtragem SQL que você nunca soube que precisava

Saiba mais sobre a cláusula SQL QUALIFY, um método de filtragem essencial, porém menos conhecido, no SQL. Entenda sua sintaxe, usos e como ela difere de outros métodos de filtragem SQL.
Kurtis Pykes 's photo

Kurtis Pykes

8 min

tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

See MoreSee More