Vai al contenuto principale

Capire la funzione SQL DECODE()

Impara a usare DECODE() in Oracle per la logica condizionale nella trasformazione dei dati. Confronta DECODE() con l'istruzione CASE WHEN per prestazioni e comportamento.
· 11 min leggi

Scopri con l'IA

Capire come implementare la logica condizionale direttamente nelle query SQL è una competenza necessaria per data scientist e data engineer. Questo tutorial offre una guida completa all'uso della funzione SQL DECODE() in Oracle. Confronterò anche DECODE() con CASE WHEN in Oracle e ti aiuterò a capire quando usare ciascuna funzione. Infine, fornirò il codice per le trasformazioni equivalenti in SQL Server, PostgreSQL e MySQL. 

Prima di passare agli esempi pratici, ti consiglio di seguire il corso di DataCamp Introduction to Oracle SQL per rinfrescare le tue competenze nell'uso del dialetto PL/SQL. Inoltre, il nostro corso Intermediate SQL ti fornirà le competenze SQL avanzate necessarie per gestire query con la funzione DECODE() perché, come vedremo, DECODE() è spesso usata con sintassi più avanzate, come le subquery.

Come usare la funzione SQL DECODE()

La funzione SQL DECODE() è supportata nativamente nel database Oracle ed è disponibile nel dialetto PL/SQL. La funzione DECODE() consente di implementare logica condizionale all'interno della query. Questa tecnica è importante perché aiuta nella trasformazione dei dati durante il recupero dei record dal database.

Considera la tabella employees qui sotto, in cui department_id ha valori numerici. Invece, vogliamo che department_id si chiami department_name e abbia categorie più comprensibili.

Tabella di esempio da trasformare usando la funzione SQL DECODE()

Tabella di esempio da trasformare usando la funzione SQL DECODE(). Immagine dell'autore.

L'esempio seguente mostra come usare la funzione DECODE() per trasformare department_id nei nomi reali.

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

Esempio di output della tabella trasformata con la funzione SQL DECODE()

Tabella di output di esempio dopo l'uso della funzione SQL DECODE(). Immagine dell'autore.

Capire la funzione SQL DECODE()

La funzione DECODE() è disponibile nel database Oracle e ti permette di trasformare una colonna usando logica condizionale. La funzione DECODE() consente più trasformazioni condizionali con una sola query semplice.

La sintassi della funzione DECODE() è la seguente:

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

Dove:

  • expression: Il valore da confrontare.

  • search: Il valore con cui confrontare l'espressione.

  • result: Il valore restituito se l'espressione corrisponde al valore di ricerca.

  • default: Il valore restituito se non viene trovata alcuna corrispondenza (opzionale).

Tecniche avanzate e considerazioni con la funzione SQL DECODE()

Alcune operazioni SQL avanzate possono essere eseguite usando la funzione DECODE(). Le tecniche avanzate consentono trasformazioni logiche condizionali più complesse. 

DECODE() con funzioni di aggregazione

La funzione DECODE() in Oracle può essere usata nella clausola SELECT per ricategorizzare una variabile, e può anche essere usata nella clausola SELECT insieme a funzioni di aggregazione per un raggruppamento più complesso, migliorando ulteriormente la flessibilità e l'interpretazione dei risultati. 

Nella query seguente, usiamo DECODE() per trasformare department_id in department_name. Usiamo anche DECODE() per categorizzare lo stipendio medio in "High Paying" o "Low Paying".

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; 

Esempio di output della tabella dopo l'uso di più funzioni SQL DECODE()

Esempio di output della tabella dopo l'uso di più funzioni SQL DECODE(). Immagine dell'autore

Istruzioni DECODE() annidate

Implementare la funzione DECODE() con subquery ti permette di effettuare trasformazioni di logica condizionale sofisticate sui dati. L'istruzione DECODE() annidata in Oracle è utile quando vogliamo valutare più condizioni in una tabella.

Nell'esempio seguente, abbiamo usato l'istruzione DECODE() annidata per categorizzare i dipendenti in base al loro reparto e stipendio.

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

Esempio di output della tabella usando un'istruzione DECODE() annidata in Oracle

Esempio di output della tabella dopo l'uso della funzione DECODE() annidata. Immagine dell'autore

Come DECODE() gestisce i valori NULL

La funzione DECODE() gestisce anche i valori NULL in due modi diversi. Per prima cosa, DECODE() si comporta come se due valori NULL fossero equivalenti. Questa funzionalità significa che i valori NULL sono considerati una corrispondenza quando si confrontano i valori della colonna con NULL. Tuttavia, fai attenzione a risultati inattesi quando il NULL non è gestito in modo esplicito, perché potrebbe mascherare i valori NULL durante la trasformazione.

Inoltre, sappi che, proprio come l'istruzione CASE WHEN, la funzione DECODE() restituisce un valore NULL se non viene trovata alcuna corrispondenza.

L'esempio seguente mostra come la funzione DECODE() restituisce valori null dove mancano department_id e 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;

Esempio di output della tabella che usa la funzione SQL DECODE() per gestire i valori NULL.

Esempio di output della tabella dopo aver usato DECODE() per gestire i valori NULL. Immagine dell'autore

DECODE vs. CASE WHEN in Oracle

La funzione DECODE() è stata introdotta per prima e, anche se è stata superata dall'istruzione CASE WHEN, è ancora preferita in alcuni contesti. Ad esempio, la sintassi della funzione DECODE() è più semplice, quindi se la logica è piuttosto semplice è più facile da leggere e comprendere. 

Inoltre, la funzione DECODE() di solito è più veloce poiché le sue prestazioni sono state ottimizzate come funzione integrata, anche se la differenza potrebbe essere trascurabile. Infine, nei sistemi Oracle legacy potresti dover usare la funzione DECODE() come funzione integrata. 

Alternative a DECODE() in altri database

La funzione DECODE() è supportata solo nel database Oracle. Tuttavia, SQL Server, PostgreSQL e MySQL forniscono metodi alternativi per applicare logica condizionale di trasformazione dei dati.

La funzione DECODE() è utile nella trasformazione dei dati perché semplifica la logica complessa eliminando l'uso di istruzioni IF ELSE o CASE. La funzione DECODE() migliora anche la leggibilità delle query, consentendo una manipolazione efficiente dei dati. Vediamo i diversi casi d'uso della funzione DECODE().

Uso di CASE WHEN in SQL Server, PostgreSQL e MySQL

L'istruzione CASE WHEN offre un'alternativa alla funzione DECODE() per eseguire la logica condizionale in SQL. La sintassi e l'implementazione di CASE WHEN sono coerenti tra i database SQL Server, PostgreSQL e MySQL.

L'esempio seguente mostra come usare l'istruzione CASE WHEN per trasformare i dati all'interno della clausola SELECT. La query mostra anche come combinare l'istruzione CASE WHEN con altre funzioni SQL per trasformazioni condizionali complesse.

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

Conclusione e approfondimenti

Capire la funzione DECODE() di Oracle è importante per imparare a trasformare i dati in modo efficace. La funzione DECODE() offre vari casi d'uso per applicare logica condizionale durante la trasformazione dei dati. È anche importante imparare alternative di trasformazione condizionale nei database SQL Server, PostgreSQL e MySQL. Ti incoraggio a esercitarti con la funzione DECODE() usando diversi dataset e casi d'uso per perfezionare le tue competenze di trasformazione dei dati.

Se vuoi far progredire le tue competenze di analisi dei dati, ti consiglio il corso di DataCamp Reporting in SQL per sviluppare le tue capacità di analisi e presentazione. Allo stesso modo, dai un'occhiata al nostro career track Associate Data Analyst in SQL per aiutarti a tenere il passo con l'SQL necessario nella tua carriera come data analyst. Infine, ti consiglio vivamente il progetto di DataCamp Data-Driven Decision Making in SQL per mostrare la tua padronanza nell'uso di diverse tecniche SQL per analisi e reporting, così da distinguerti tra gli altri data analyst.

Allan Ouko

Autore

Allan Ouko

Technical writer di Data Science con esperienza pratica in data analytics, business intelligence e data science. Scrivo contenuti pratici e orientati al settore su SQL, Python, Power BI, Databricks e data engineering, basati su lavoro di analytics reale. La mia scrittura unisce profondità tecnica e impatto sul business, aiutando i professionisti a trasformare i dati in decisioni sicure.

Domande frequenti

Che cos'è la funzione SQL DECODE()?

SQL DECODE() è una funzione usata per eseguire logica condizionale nelle trasformazioni dei dati.

Quali database supportano la funzione SQL DECODE()?

Solo il database Oracle supporta nativamente la funzione SQL DECODE(). SQL Server, PostgreSQL e MySQL consentono trasformazioni condizionali usando l'istruzione CASE WHEN.

Posso usare DECODE() con altre funzioni SQL?

La funzione Oracle DECODE() può essere usata con altre funzioni SQL, come AVG(), SUM() e COUNT(), per eseguire trasformazioni condizionali avanzate.

Posso usare istruzioni DECODE() annidate?

I database Oracle supportano istruzioni DECODE() annidate per logiche complesse. Tuttavia, istruzioni DECODE() molto lunghe e annidate possono diventare difficili da mantenere e leggere.

La funzione DECODE() può gestire i valori NULL?

La funzione DECODE() gestisce i valori NULL in modo predefinito e restituirà valori NULL se la condizione non è soddisfatta durante la trasformazione dei dati.

Oltre a DECODE(), quali altre funzioni sono specifiche di Oracle?

Altre funzioni specifiche del database Oracle includono NVL(), che sostituisce i valori NULL con valori specificati.

Argomenti

Correlato