Ga naar hoofdinhoud

De SQL-functie DECODE() begrijpen

Leer hoe je DECODE() in Oracle gebruikt voor voorwaardelijke logica bij datatransformatie. Vergelijk DECODE() met de CASE WHEN-instructie qua prestaties en gedrag.
· 11 min lezen

Verken met AI

Weten hoe je voorwaardelijke logica direct in SQL-query’s toepast, is een noodzakelijke vaardigheid voor data scientists en data engineers. Deze tutorial biedt een complete gids voor het gebruik van de SQL-functie DECODE() in Oracle. Ik vergelijk DECODE() ook met CASE WHEN in Oracle en help je begrijpen wanneer je welke functie gebruikt. Tot slot geef ik code voor equivalente transformaties in SQL Server, PostgreSQL en MySQL. 

Voordat we naar de praktische voorbeelden kijken, raad ik aan om DataCamp’s cursus Introduction to Oracle SQL te volgen om je PL/SQL-vaardigheden op te frissen. Ook onze cursus Intermediate SQL geeft je de geavanceerde SQL-vaardigheden die je nodig hebt bij queries met de functie DECODE(), omdat DECODE() vaak wordt gebruikt met geavanceerdere syntax, zoals subquery’s.

Hoe gebruik je de SQL-functie DECODE()

De SQL-functie DECODE() wordt native ondersteund in de Oracle-database en is beschikbaar in het PL/SQL-dialect. Met de functie DECODE() kun je voorwaardelijke logica binnen de query implementeren. Deze techniek is belangrijk omdat ze helpt bij datatransformatie tijdens het ophalen van records uit de database.

Bekijk de onderstaande tabel employees, waar department_id numerieke waarden heeft. In plaats daarvan willen we dat department_id department_name heet en begrijpelijkere categorieën heeft.

Voorbeeldtabel om te transformeren met de SQL-functie DECODE()

Voorbeeldtabel om te transformeren met de SQL-functie DECODE(). Afbeelding door de auteur.

Het onderstaande voorbeeld laat zien hoe je de functie DECODE() gebruikt om department_id naar de echte namen te transformeren.

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

Voorbeelduitvoer van tabel getransformeerd met de SQL-functie DECODE()

Voorbeelduitvoertabel na gebruik van de SQL-functie DECODE(). Afbeelding door de auteur.

De SQL-functie DECODE() begrijpen

De functie DECODE() is beschikbaar in de Oracle-database en stelt je in staat een kolom te transformeren met voorwaardelijke logica. De functie DECODE() maakt meerdere voorwaardelijke transformaties mogelijk met één eenvoudige query.

De syntax van de functie DECODE() is als volgt:

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

Waarbij:

  • expression: De waarde om te vergelijken.

  • search: De waarde waartegen de expressie wordt vergeleken.

  • result: De waarde die wordt geretourneerd als de expressie overeenkomt met de zoekwaarde.

  • default: De waarde die wordt geretourneerd als er geen overeenkomst is gevonden (optioneel).

Geavanceerde technieken en aandachtspunten met de SQL-functie DECODE()

Met de functie DECODE() kun je enkele geavanceerde SQL-bewerkingen uitvoeren. De geavanceerde technieken maken complexere transformaties met voorwaardelijke logica mogelijk. 

DECODE() met aggregatiefuncties

De functie DECODE() in Oracle kan worden gebruikt in de SELECT-instructie om een variabele opnieuw te categoriseren, en kan ook worden gebruikt in de SELECT-instructie met aggregatiefuncties voor een complexere groepering, wat de flexibiliteit en interpretatie van de resultaten verder verbetert. 

In de volgende query gebruiken we DECODE() om department_id om te zetten naar department_name. We gebruiken DECODE() ook om het gemiddelde salaris te categoriseren als ‘High Paying’ of '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; 

Voorbeelduitvoer van tabel na gebruik van meerdere SQL DECODE()-functies

Voorbeelduitvoer van tabel na gebruik van meerdere SQL DECODE()-functies. Afbeelding door de auteur

Geneste DECODE()-instructies

Het implementeren van de functie DECODE() met subquery’s stelt je in staat geavanceerde transformaties met voorwaardelijke logica op de data uit te voeren. De geneste DECODE()-instructie in Oracle helpt wanneer we meerdere voorwaarden in een tabel willen evalueren.

In het onderstaande voorbeeld hebben we de geneste DECODE()-instructie gebruikt om werknemers te categoriseren op basis van hun afdeling en salaris.

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

Voorbeelduitvoer van tabel met gebruik van geneste SQL DECODE()-instructie in Oracle

Voorbeelduitvoer van tabel na gebruik van de geneste DECODE()-functie. Afbeelding door de auteur

Hoe DECODE() NULL-waarden afhandelt

De functie DECODE() gaat op twee manieren anders om met NULL-waarden. Om te beginnen behandelt DECODE() twee NULL-waarden als gelijkwaardig. Dit betekent dat NULL-waarden als een match worden beschouwd wanneer kolomwaarden met NULL worden vergeleken. Let wel op onverwachte resultaten waarbij niet expliciet rekening is gehouden met NULL, omdat NULL-waarden hierdoor tijdens de transformatie gemaskeerd kunnen worden.

Weet ook dat, net als bij de CASE WHEN-instructie, de functie DECODE() een NULL-waarde retourneert als er geen overeenkomst is gevonden.

Het onderstaande voorbeeld laat zien hoe de functie DECODE() null-waarden retourneert waar department_id en salary ontbreken.

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

Voorbeelduitvoer van tabel met SQL DECODE()-functie om NULL-waarden af te handelen.

Voorbeelduitvoer van tabel na gebruik van DECODE() om NULL-waarden af te handelen. Afbeelding door de auteur

DECODE vs. CASE WHEN in Oracle

De functie DECODE() werd als eerste geïntroduceerd en hoewel deze is opgevolgd door de CASE WHEN-instructie, heeft DECODE() nog steeds de voorkeur in sommige contexten. Zo is de syntax van de functie DECODE() eenvoudiger; als de logica vrij simpel is, leest en begrijpt die makkelijker. 

Ook is de functie DECODE() meestal sneller, omdat de prestaties zijn geoptimaliseerd als ingebouwde functie, al kan het verschil verwaarloosbaar zijn. Tot slot kan het in verouderde Oracle-systemen nodig zijn om de ingebouwde functie DECODE() te gebruiken. 

Alternatieven voor DECODE() in andere databases

De functie DECODE() wordt alleen ondersteund in de Oracle-database. SQL Server, PostgreSQL en MySQL bieden echter alternatieve methoden om voorwaardelijke transformatielogica toe te passen.

De functie DECODE() is nuttig bij datatransformatie, omdat ze complexe logica vereenvoudigt door het gebruik van IF ELSE- of CASE-instructies te vermijden. De functie DECODE() verbetert ook de leesbaarheid van queries, wat efficiënte datamanipulatie mogelijk maakt. Laten we de verschillende use-cases van de functie DECODE() bekijken.

CASE WHEN gebruiken in SQL Server, PostgreSQL en MySQL

De CASE WHEN-instructie biedt een alternatief voor de functie DECODE() om SQL’s voorwaardelijke logica te implementeren. De syntax en implementatie van CASE WHEN zijn consistent in SQL Server-, PostgreSQL- en MySQL-databases.

Het onderstaande voorbeeld laat zien hoe je de CASE WHEN-instructie gebruikt om data te transformeren binnen de SELECT-instructie. De query laat ook zien hoe je de CASE WHEN-instructie combineert met andere SQL-functies voor complexe voorwaardelijke transformaties.

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

Conclusie en verder leren

De Oracle-functie DECODE() begrijpen is belangrijk om te leren hoe je data effectief transformeert. De functie DECODE() biedt diverse use-cases voor het toepassen van voorwaardelijke logica tijdens datatransformatie. Het is ook belangrijk dat je alternatieve voorwaardelijke transformaties leert in SQL Server-, PostgreSQL- en MySQL-databases. Ik moedig je aan om de functie DECODE() te oefenen met verschillende datasets en use-cases om je transformatieskills te verfijnen.

Als je je data-analysevaardigheden wilt uitbreiden, raad ik DataCamp’s cursus Reporting in SQL aan om je analyse- en presentatieskills verder te ontwikkelen. Bekijk ook ons Associate Data Analyst in SQL-carrièrepad om de voortgang bij te houden van de benodigde SQL-kennis voor je loopbaan als data-analist. Tot slot raad ik DataCamp’s project Data-Driven Decision Making in SQL ten zeerste aan om je beheersing van verschillende SQL-technieken voor analyse en rapportage te laten zien, zodat je je onderscheidt van andere data-analisten.

Allan Ouko

Auteur

Allan Ouko

\n
\n
\n
\n
Technical writer voor data science met praktische ervaring in data-analyse, business intelligence en data science. Ik schrijf praktische, op de industrie gerichte content over SQL, Python, Power BI, Databricks en data engineering, gebaseerd op analytisch werk in de echte wereld. Mijn schrijfwerk slaat een brug tussen technische diepgang en zakelijke impact, en helpt professionals om data om te zetten in onderbouwde beslissingen.
\n
\n
\n
\n

Veelgestelde vragen

Wat is de SQL-functie DECODE()?

SQL DECODE() is een functie die wordt gebruikt om voorwaardelijke logica toe te passen voor datatransformatie.

Welke databases ondersteunen de SQL-functie DECODE()?

Alleen de Oracle-database ondersteunt de SQL-functie DECODE() native. SQL Server, PostgreSQL en MySQL staan voorwaardelijke transformatie toe met de CASE WHEN-instructie.

Kan ik DECODE() gebruiken met andere SQL-functies?

De Oracle-functie DECODE() kan worden gebruikt met andere SQL-functies, zoals AVG(), SUM() en COUNT(), om geavanceerde voorwaardelijke transformaties uit te voeren.

Kan ik geneste DECODE()-instructies gebruiken?

Oracle-databases ondersteunen geneste DECODE()-instructies voor complexe logica. Langere geneste DECODE()-instructies kunnen echter lastig te onderhouden en te lezen worden.

Kan de functie DECODE() NULL-waarden afhandelen?

De functie DECODE() behandelt NULL-waarden als standaard en retourneert NULL-waarden als aan de voorwaarde niet wordt voldaan tijdens de datatransformatie.

Welke andere functies zijn naast DECODE() uniek voor Oracle?

Andere functies die uniek zijn voor de Oracle-database zijn onder meer NVL(), waarmee NULL-waarden worden vervangen door opgegeven waarden.

Onderwerpen

Gerelateerd