Direkt zum Inhalt

Die SQL-Funktion DECODE() verstehen

Lerne, wie du DECODE() in Oracle für bedingte Logik bei der Datentransformation nutzen kannst. Vergleiche DECODE() mit der CASE WHEN-Anweisung hinsichtlich Leistung und Verhalten.
Aktualisierte 15. Jan. 2025  · 11 Min. Lesezeit

Die Fähigkeit, bedingte Logik direkt in SQL-Abfragen zu implementieren, ist für Data Scientists und Data Engineers unerlässlich. Dieses Tutorial bietet eine umfassende Anleitung zur Verwendung der Funktion SQL DECODE() in Oracle. Außerdem vergleiche ich DECODE() mit CASE WHEN in Oracle und zeige dir, wann du welche Funktion verwenden solltest. Schließlich werde ich Code für die entsprechenden Transformationen in SQL Server, PostgreSQL und MySQL bereitstellen. 

Bevor wir uns die praktischen Beispiele ansehen, empfehle ich dir, den Kurs Einführung in Oracle SQL von DataCamp zu besuchen, um deine Kenntnisse im Umgang mit dem PL/SQL-Dialekt aufzufrischen. Unser SQL-Kurs für Fortgeschrittene vermittelt dir außerdem die fortgeschrittenen SQL-Kenntnisse, die du brauchst, wenn du Abfragen mit der Funktion DECODE() bearbeitest, denn wie wir sehen werden, wird DECODE() oft mit einer fortgeschritteneren Syntax verwendet, z. B. mit Unterabfragen.

Wie man die SQL-Funktion DECODE() verwendet

Die Funktion SQL DECODE() wird in der Oracle-Datenbank nativ unterstützt und ist im PL/SQL-Dialekt verfügbar. Die Funktion DECODE() ermöglicht die Implementierung von bedingter Logik innerhalb der Abfrage. Diese Technik ist wichtig, denn sie hilft bei der Datenumwandlung, wenn du Datensätze aus der Datenbank abrufst.

Betrachte die folgende Tabelle employees, in der department_id numerische Werte hat. Stattdessen wollen wir, dass department_id department_name genannt wird und verständlichere Kategorien hat.

Beispieltabelle zur Umwandlung mit der SQL-Funktion DECODE()

Beispieltabelle zur Umwandlung mit der SQL-Funktion DECODE(). Bild vom Autor.

Das folgende Beispiel zeigt, wie du die Funktion DECODE() verwendest, um die department_id in die tatsächlichen Namen umzuwandeln.

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

Beispiel für die Ausgabe einer Tabelle, die mit der SQL-Funktion DECODE() umgewandelt wurde

Beispiel einer Ausgabetabelle nach Verwendung der SQL-Funktion DECODE(). Bild vom Autor.

Die SQL-Funktion DECODE() verstehen

Die Funktion DECODE() ist in der Oracle-Datenbank verfügbar und ermöglicht es dir, eine Spalte mithilfe einer bedingten Logik umzuwandeln. Die Funktion DECODE() ermöglicht mehrere bedingte Umwandlungen mit einer einfachen Abfrage.

Die Syntax der Funktion DECODE() sieht wie folgt aus:

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

Wo:

  • expression: Der zu vergleichende Wert.

  • search: Der Wert, der mit dem Ausdruck verglichen werden soll.

  • result: Der Wert, der zurückgegeben wird, wenn der Ausdruck mit dem Suchwert übereinstimmt.

  • default: Der Wert, der zurückgegeben wird, wenn keine Übereinstimmung gefunden wird (optional).

Fortgeschrittene Techniken und Überlegungen mit der SQL-Funktion DECODE()

Einige erweiterte SQL-Operationen können mit der Funktion DECODE() durchgeführt werden. Die fortgeschrittenen Techniken ermöglichen eine komplexere Umwandlung der bedingten Logik. 

DECODE() mit Aggregatfunktionen

Die Funktion DECODE() in Oracle kann in der Anweisung SELECT verwendet werden, um eine Variable neu zu kategorisieren, und sie kann auch in der Anweisung SELECT mit Aggregatfunktionen für eine kompliziertere Gruppierung verwendet werden, was die Flexibilität und Interpretation der Ergebnisse weiter verbessert. 

In der folgenden Abfrage verwenden wir DECODE(), um department_id in department_name umzuwandeln. Wir verwenden DECODE() auch, um das Durchschnittsgehalt in "hochbezahlte" und "niedrigbezahlte" Gehälter einzuteilen.

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; 

Beispiel für die Ausgabe einer Tabelle nach Verwendung mehrerer SQL DECODE()-Funktionen

Beispiel für die Ausgabe einer Tabelle nach Verwendung mehrerer SQL DECODE()-Funktionen. Bild vom Autor

Verschachtelte DECODE()-Anweisungen

Wenn du die Funktion DECODE() mit Unterabfragen implementierst, kannst du anspruchsvolle logische Transformationen der Daten durchführen. Die geschachtelte DECODE() Anweisung in Oracle hilft, wenn wir mehrere Bedingungen in einer Tabelle auswerten wollen.

Im folgenden Beispiel haben wir die verschachtelte Anweisung DECODE() verwendet, um die Mitarbeiter nach ihrer Abteilung und ihrem Gehalt zu kategorisieren.

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

Beispiel für die Ausgabe einer Tabelle mit der verschachtelten SQL-Anweisung DECODE() in Oracle

Beispiel für die Ausgabe einer Tabelle nach Verwendung der verschachtelten DECODE()-Funktion. Bild vom Autor

Wie DECODE() NULL-Werte behandelt

Die Funktion DECODE() behandelt die Werte von NULL auf zwei verschiedene Arten. Zum einen verhält sich DECODE() so, als ob zwei NULL Werte gleichwertig sind. Diese Funktionalität bedeutet, dass die Werte von NULL als übereinstimmend angesehen werden, wenn die Spaltenwerte mit NULL verglichen werden. Dennoch solltest du auf unerwartete Ergebnisse achten, wenn die NULL nicht explizit berücksichtigt wird, da sie die NULL Werte während der Transformation verdecken kann.

Außerdem solltest du wissen, dass die Funktion DECODE() genau wie die Anweisung CASE WHEN einen Wert NULL zurückgibt, wenn keine Übereinstimmung gefunden wird.

Das folgende Beispiel zeigt, wie die Funktion DECODE() Nullwerte zurückgibt, wenn department_id und salary fehlen.

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

Beispiel für die Ausgabe einer Tabelle mit der SQL-Funktion DECODE() zur Behandlung von NULL-Werten.

Beispiel für die Ausgabe einer Tabelle nach der Verwendung von DECODE() zur Behandlung von NULL-Werten. Bild vom Autor

DECODE vs. CASE WHEN in Oracle

Die Funktion DECODE() war die erste, die eingeführt wurde, und obwohl sie durch die Anweisung CASE WHEN ersetzt wurde, wird sie in manchen Zusammenhängen immer noch bevorzugt. Die Funktionssyntax von DECODE() ist zum Beispiel einfacher. Wenn die Logik also recht einfach ist, ist sie leichter zu lesen und zu verstehen. 

Außerdem ist die Funktion DECODE() in der Regel schneller, da ihre Leistung als eingebaute Funktion optimiert wurde, auch wenn der Unterschied vernachlässigbar sein mag. In älteren Oracle-Systemen musst du unter Umständen die Funktion DECODE() als integrierte Funktion verwenden. 

Alternativen zu DECODE() in anderen Datenbanken

Die Funktion DECODE() wird nur in der Oracle-Datenbank unterstützt. SQL Server, PostgreSQL und MySQL bieten jedoch alternative Methoden für die Anwendung bedingter Datenumwandlungslogik.

Die Funktion DECODE() ist bei der Datenumwandlung nützlich, da sie die komplexe Logik vereinfacht, indem sie die Verwendung von IF ELSE oder CASE Anweisungen überflüssig macht. Die Funktion DECODE() verbessert außerdem die Lesbarkeit von Abfragen und ermöglicht eine effiziente Datenmanipulation. Schauen wir uns die verschiedenen Anwendungsfälle der Funktion DECODE() an.

Verwendung von CASE WHEN in SQL Server, PostgreSQL und MySQL

Die Anweisung CASE WHEN bietet eine Alternative zur Funktion DECODE(), um die bedingte Logikumwandlung von SQL durchzuführen. Die Syntax und Implementierung von CASE WHEN ist für SQL Server, PostgreSQL und MySQL-Datenbanken einheitlich.

Das folgende Beispiel zeigt, wie du die CASE WHEN Anweisung verwendest, um Daten innerhalb der SELECT Anweisung umzuwandeln. Die Abfrage zeigt auch, wie man die Anweisung CASE WHEN mit anderen SQL-Funktionen für komplexe bedingte Umwandlungen kombinieren kann.

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

Fazit und weiteres Lernen

Das Verständnis der Oracle-Funktion DECODE() ist wichtig, um zu lernen, wie man Daten effektiv umwandelt. Die Funktion DECODE() bietet verschiedene Anwendungsfälle für die Anwendung bedingter Logik bei der Datenumwandlung. Es ist auch wichtig, dass du die alternative bedingte Umwandlung in SQL Server-, PostgreSQL- und MySQL-Datenbanken lernst. Ich empfehle dir, die Funktion DECODE() mit verschiedenen Datensätzen und Anwendungsfällen zu üben, um deine Fähigkeiten zur Datenumwandlung zu verbessern.

Wenn du deine Fähigkeiten in der Datenanalyse verbessern möchtest, empfehle ich dir den Kurs Reporting in SQL von DataCamp, um deine Analyse- und Präsentationsfähigkeiten zu erweitern. Ebenso solltest du dir unseren Lernpfad zum Associate Data Analyst in SQL ansehen, damit du die notwendigen SQL-Kenntnisse für deine Karriere als Datenanalyst/in behältst. Abschließend empfehle ich dir das DataCamp-Projekt " Data-Driven Decision Making in SQL", in dem du zeigen kannst, dass du verschiedene SQL-Techniken für Analysen und Berichte beherrschst, um dich von anderen Datenanalysten abzuheben.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Ich verfasse Artikel, die Datenwissenschaft und Analytik vereinfachen und leicht verständlich und zugänglich machen.

Häufig gestellte Fragen

Was ist die SQL-Funktion DECODE()?

Die SQL DECODE() ist eine Funktion, die verwendet wird, um bedingte Logik für die Datenumwandlung durchzuführen.

Welche Datenbanken unterstützen die SQL-Funktion DECODE()?

Nur die Oracle-Datenbank unterstützt von Haus aus die Funktion SQL DECODE(). SQL Server, PostgreSQL und MySQL erlauben eine bedingte Umwandlung mit der Anweisung CASE WHEN.

Kann ich DECODE() mit anderen SQL-Funktionen verwenden?

Die Oracle-Funktion DECODE() kann mit anderen SQL-Funktionen wie AVG(), SUM() und COUNT() verwendet werden, um erweiterte bedingte Transformationen durchzuführen.

Kann ich verschachtelte DECODE()-Anweisungen verwenden?

Die Oracle-Datenbanken unterstützen verschachtelte DECODE() Anweisungen für komplexe Logik. Längere verschachtelte DECODE() Anweisungen können jedoch schwer zu pflegen und zu lesen sein.

Kann die Funktion DECODE() mit NULL-Werten umgehen?

Die Funktion DECODE() behandelt die Werte von NULL als Standard und gibt die Werte von NULL zurück, wenn die Bedingung bei der Datenumwandlung nicht erfüllt ist.

Welche anderen Funktionen außer DECODE() gibt es bei Oracle?

Zu den weiteren Funktionen, die es nur in der Oracle-Datenbank gibt, gehört NVL(), das die Werte von NULL durch bestimmte Werte ersetzt.

Themen

SQL lernen mit DataCamp

Zertifizierung verfügbar

Kurs

Einführung in Oracle SQL

4 hr
11.7K
Vertiefe deine Kenntnisse in Oracle SQL, einschließlich SQL-Grundlagen, Aggregation, Kombination und Anpassung von Daten.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow