Saltar al contenido principal
InicioTutorialesSQL

Comprender la función DECODE() de SQL

Aprende a utilizar DECODE() en Oracle para la lógica condicional en la transformación de datos. Compara DECODE() con la sentencia CASE WHEN en cuanto a rendimiento y comportamiento.
Actualizado ago 2024  · 11 min leer

Comprender cómo implementar la lógica condicional directamente dentro de las consultas SQL es una habilidad necesaria para los analistas de datos, científicos e ingenieros. Este tutorial proporciona una guía completa sobre el uso de la función SQL DECODE() en Oracle. También compararé DECODE() con CASE WHEN en Oracle y te ayudaré a entender cuándo utilizar cada función. Por último, proporcionaré código para las transformaciones equivalentes en SQL Server, PostgreSQL y MySQL. 

Antes de ver los ejemplos prácticos, te recomiendo que sigas el curso Introducción a Oracle SQL de DataCamp para refrescar tus conocimientos sobre el uso del dialecto PL/SQL. Además, nuestro curso de SQL Intermedio te dotará de los conocimientos avanzados de SQL necesarios para manejar consultas con la función DECODE() porque, como veremos, DECODE() se utiliza a menudo con una sintaxis más avanzada, como las subconsultas.

Cómo utilizar la función DECODE() de SQL

La función SQL DECODE() está soportada de forma nativa en la base de datos Oracle y está disponible en el dialecto PL/SQL. La función DECODE() permite implementar la lógica condicional dentro de la consulta. Esta técnica es importante porque ayuda en la transformación de datos al recuperar registros de la base de datos.

Considera la siguiente tabla employees, en la que department_id tiene valores numéricos. En su lugar, queremos que department_id se llame department_name y tenga categorías más comprensibles.

Ejemplo de tabla a transformar utilizando la función SQL DECODE()

Tabla de ejemplo para transformar utilizando la función SQL DECODE(). Imagen del autor.

El ejemplo siguiente muestra cómo utilizar la función DECODE() para transformar los department_id en los nombres reales.

-- 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;

Ejemplo de salida de tabla transformada mediante la función SQL DECODE()

Ejemplo de tabla de salida tras utilizar la función SQL DECODE(). Imagen del autor.

Comprender la función DECODE() de SQL

La función DECODE() está disponible en la base de datos Oracle y te permite transformar una columna utilizando la lógica condicional. La función DECODE() permite múltiples transformaciones condicionales utilizando una simple consulta.

La sintaxis de la función DECODE() es la que se muestra a continuación:

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

Dónde:

  • expression: El valor a comparar.

  • search: El valor a comparar con la expresión.

  • result: El valor devuelto si la expresión coincide con el valor buscado.

  • default: El valor devuelto si no se encuentra ninguna coincidencia (opcional).

Técnicas y consideraciones avanzadas con la función DECODE() de SQL

Algunas operaciones SQL avanzadas pueden realizarse utilizando la función DECODE(). Las técnicas avanzadas permiten una transformación lógica condicional más compleja. 

DECODE() con funciones agregadas

La función DECODE() de Oracle puede utilizarse en la sentencia SELECT para recategorizar una variable, y también puede utilizarse en la sentencia SELECT con funciones agregadas para una agrupación más complicada, lo que mejora aún más la flexibilidad y la interpretación de los resultados. 

En la siguiente consulta, utilizamos DECODE() para transformar department_id en department_name. También utilizamos DECODE() para clasificar el salario medio en "salarios altos" o "salarios bajos".

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; 

Ejemplo de salida de una tabla tras utilizar varias funciones SQL DECODE()

Ejemplo de salida de una tabla tras utilizar varias funciones SQL DECODE(). Imagen del autor

Sentencias DECODE() anidadas

Implementar la función DECODE() con subconsultas te permite realizar sofisticadas transformaciones lógicas condicionales de los datos. La sentencia DECODE() anidada en Oracle ayuda cuando queremos evaluar varias condiciones en una tabla.

En el ejemplo siguiente, hemos utilizado la sentencia anidada DECODE() para clasificar a los empleados en función de su departamento y salario.

-- 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;

Ejemplo de salida de tabla al utilizar la sentencia DECODE() anidada SQL en Oracle

Ejemplo de salida de tabla tras utilizar la función DECODE() anidada. Imagen del autor

Cómo trata DECODE() los valores NULL

La función DECODE() también trata de forma diferente los valores de NULL de dos maneras. Por un lado, DECODE() actúa como si dos valores de NULL fueran equivalentes. Esta funcionalidad significa que los valores de NULL se consideran coincidentes al comparar los valores de la columna con NULL. Aun así, debes tener cuidado con los resultados inesperados en los que no se tenga en cuenta explícitamente la NULL, ya que puede enmascarar los valores de NULL durante la transformación.

Además, debes saber que, al igual que la sentencia CASE WHEN, la función DECODE() devuelve un valor NULL si no se encuentra ninguna coincidencia.

El ejemplo siguiente muestra cómo la función DECODE() devuelve valores nulos cuando faltan department_id y salary.

-- 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;

Ejemplo de salida de tabla utilizando la función SQL DECODE() para tratar valores NULL.

Ejemplo de salida de tabla después de utilizar DECODE() para tratar valores NULL. Imagen del autor

DECODE vs. CASE WHEN en Oracle

La función DECODE() fue la primera que se introdujo, y aunque ha sido sustituida por la declaración CASE WHEN, sigue siendo la preferida en algunos contextos. Por ejemplo, la sintaxis de la función DECODE() es más sencilla, por lo que si la lógica es bastante simple, es más fácil de leer y entender. 

Además, la función DECODE() suele ser más rápida, ya que su rendimiento se ha optimizado como función incorporada, aunque la diferencia puede ser insignificante. Por último, en los sistemas Oracle heredados, puede que tengas que utilizar la función DECODE() como función incorporada. 

Alternativas a DECODE() en otras bases de datos

La función DECODE() sólo es compatible con la base de datos Oracle. Sin embargo, SQL Server, PostgreSQL y MySQL proporcionan métodos alternativos para aplicar la lógica de transformación condicional de datos.

La función DECODE() es útil en la transformación de datos, ya que simplifica la lógica compleja al eliminar el uso de las sentencias IF ELSE o CASE. La función DECODE() también mejora la legibilidad de las consultas, permitiendo una manipulación eficaz de los datos. Examinemos los distintos casos de uso de la función DECODE().

Uso de CASE WHEN en SQL Server, PostgreSQL y MySQL

La sentencia CASE WHEN proporciona una alternativa a la función DECODE() para realizar la transformación lógica condicional de SQL. La sintaxis y la implementación de CASE WHEN son coherentes en las bases de datos SQL Server, PostgreSQL y MySQL.

El siguiente ejemplo muestra cómo utilizar la sentencia CASE WHEN para transformar los datos dentro de la sentencia SELECT. La consulta también muestra cómo combinar la sentencia CASE WHEN con otras funciones SQL para una transformación condicional compleja.

 -- 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   

Conclusión y aprendizaje posterior

Comprender la función Oracle DECODE() es importante para aprender a transformar datos con eficacia. La función DECODE() ofrece varios casos de uso para aplicar la lógica condicional durante la transformación de datos. También es importante que aprendas transformaciones condicionales alternativas en bases de datos SQL Server, PostgreSQL y MySQL. Te animo a que practiques la función DECODE() utilizando diferentes conjuntos de datos y casos de uso para perfeccionar tus habilidades de transformación de datos.

Si quieres avanzar en tus habilidades de análisis de datos, te recomiendo que sigas el curso de Informes en SQL de DataCamp para mejorar tus habilidades de análisis y presentación. Del mismo modo, deberías echar un vistazo a nuestro itinerario profesional de Analista de Datos Asociado en SQL para ayudarte a mantener el progreso del SQL necesario que necesitarás en tu carrera como analista de datos. Por último, te recomiendo encarecidamente que realices el proyecto Data-Driven Decision Making in SQL de DataCamp para demostrar tu dominio en el uso de distintas técnicas SQL para el análisis y la elaboración de informes, y así destacar entre los demás analistas de datos.

Preguntas frecuentes

¿Qué es la función DECODE() de SQL?

El SQL DECODE() es una función utilizada para realizar una lógica condicional para la transformación de datos.

¿Qué bases de datos admiten la función DECODE() de SQL?

Sólo la base de datos Oracle admite de forma nativa la función SQL DECODE(). SQL Server, PostgreSQL y MySQL permiten la transformación condicional mediante la sentencia CASE WHEN.

¿Puedo utilizar DECODE() con otras funciones SQL?

La función Oracle DECODE() puede utilizarse con otras funciones SQL, como AVG(), SUM() y COUNT() para realizar transformaciones condicionales avanzadas.

¿Puedo utilizar sentencias DECODE() anidadas?

Las bases de datos Oracle admiten sentencias DECODE() anidadas para lógica compleja. Sin embargo, las declaraciones DECODE() anidadas más largas pueden resultar difíciles de mantener y leer.

¿Puede la función DECODE() manejar valores NULL?

La función DECODE() maneja los valores NULL por defecto y devolverá los valores NULL si no se cumple la condición durante la transformación de los datos.

Además de DECODE(), ¿qué otras funciones son exclusivas de Oracle?

Otras funciones exclusivas de la base de datos Oracle son NVL(), que sustituye los valores de NULL por los valores especificados.

Temas

Aprende SQL con 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 másRight Arrow
Relacionado

tutorial

Función SQL COALESCE

COALESCE() es una de las funciones más útiles de SQL. Lee este tutorial para aprender a dominarlo.
Travis Tang 's photo

Travis Tang

4 min

tutorial

FUNCIÓN SQL FORMAT()

FORMAT() es una de las funciones más utilizadas en SQL. Conozca sus principales aplicaciones en este tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

Introducción a los disparadores SQL: Guía para desarrolladores

Aprende a utilizar los disparadores SQL para automatizar tareas, mantener la integridad de los datos y mejorar el rendimiento de la base de datos. Prueba ejemplos prácticos como los comandos CREATE, ALTER y DROP en MySQL y Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

13 min

tutorial

FUNCIÓN SQL DATEDIFF()

DATEDIFF() es una de las funciones de manipulación de datos de fecha más utilizadas en SQL. Conviértete en un experto leyendo este tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

FUNCIÓN SQL COUNT()

COUNT() te permite contar el número de filas que cumplen determinadas condiciones. Aprende a utilizarlo en este tutorial.
Travis Tang 's photo

Travis Tang

3 min

tutorial

Tutorial de comparación de patrones SQL LIKE

Utiliza LIKE para filtrar registros SQL según coincidencias de cadenas específicas. Este tutorial te enseña a utilizar comodines, NOT, LOWER, UPPER y CASE WHEN con LIKE.
Travis Tang 's photo

Travis Tang

8 min

See MoreSee More