Accéder au contenu principal

Comprendre la fonction SQL DECODE()

Apprenez à utiliser DECODE() dans Oracle pour la logique conditionnelle dans la transformation des données. Comparez DECODE() à l'instruction CASE WHEN en termes de performances et de comportement.
Actualisé 15 janv. 2025  · 11 min de lecture

Comprendre comment mettre en œuvre la logique conditionnelle directement dans les requêtes SQL est une compétence nécessaire pour les data scientists et les data engineers. Ce tutoriel fournit un guide complet de l'utilisation de la fonction SQL DECODE() dans Oracle. Je vais également comparer DECODE() à CASE WHEN dans Oracle et vous aider à comprendre quand utiliser chaque fonction. Enfin, je fournirai le code pour les transformations équivalentes dans SQL Server, PostgreSQL et MySQL. 

Avant d'aborder les exemples pratiques, je vous recommande de suivre le cours Introduction à Oracle SQL de DataCamp pour rafraîchir vos connaissances sur l'utilisation du dialecte PL/SQL. De plus, notre cours SQL intermédiaire vous permettra d'acquérir les compétences SQL avancées nécessaires pour traiter les requêtes avec la fonction DECODE() car, comme nous le verrons, DECODE() est souvent utilisé avec une syntaxe plus avancée, telle que les sous-requêtes.

Comment utiliser la fonction SQL DECODE()

La fonction SQL DECODE() est prise en charge de manière native dans la base de données Oracle et est disponible dans le dialecte PL/SQL. La fonction DECODE() permet de mettre en œuvre une logique conditionnelle dans la requête. Cette technique est importante car elle permet de transformer les données lors de l'extraction d'enregistrements de la base de données.

Considérez le tableau employees ci-dessous, dans lequel department_id a des valeurs numériques. Nous souhaitons plutôt que department_id soit appelé department_name et que ses catégories soient plus compréhensibles.

Exemple de tableau à transformer à l'aide de la fonction SQL DECODE()

Exemple de tableau à transformer à l'aide de la fonction SQL DECODE(). Image par l'auteur.

L'exemple ci-dessous montre comment utiliser la fonction DECODE() pour transformer les department_id en noms réels.

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

Exemple de sortie d'un tableau transformé à l'aide de la fonction SQL DECODE()

Exemple de tableau de sortie après utilisation de la fonction SQL DECODE(). Image par l'auteur.

Comprendre la fonction SQL DECODE()

La fonction DECODE() est disponible dans la base de données Oracle et vous permet de transformer une colonne à l'aide d'une logique conditionnelle. La fonction DECODE() permet d'effectuer plusieurs transformations conditionnelles à l'aide d'une simple requête.

La syntaxe de la fonction DECODE() est la suivante :

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

Où ?

  • expression: La valeur à comparer.

  • search: La valeur à comparer à l'expression.

  • result: Valeur renvoyée si l'expression correspond à la valeur recherchée.

  • default: La valeur renvoyée si aucune correspondance n'est trouvée (facultatif).

Techniques avancées et considérations sur la fonction SQL DECODE()

Certaines opérations SQL avancées peuvent être effectuées à l'aide de la fonction DECODE(). Les techniques avancées permettent une transformation plus complexe de la logique conditionnelle. 

DECODE() avec des fonctions agrégées

La fonction DECODE() d'Oracle peut être utilisée dans l'instruction SELECT pour recatégoriser une variable, et elle peut également être utilisée dans l'instruction SELECT avec des fonctions d'agrégation pour un regroupement plus complexe, ce qui améliore encore la flexibilité et l'interprétation des résultats. 

Dans la requête suivante, nous utilisons DECODE() pour transformer department_id en department_name. Nous utilisons également le site DECODE() pour classer les salaires moyens en deux catégories : "hauts salaires" et "bas salaires".

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; 

Exemple de sortie de tableau après l'utilisation de plusieurs fonctions SQL DECODE()

Exemple de sortie de tableau après l'utilisation de plusieurs fonctions SQL DECODE(). Image par l'auteur

Instructions DECODE() imbriquées

La mise en œuvre de la fonction DECODE() avec des sous-requêtes vous permet d'effectuer des transformations logiques conditionnelles sophistiquées sur les données. L'instruction imbriquée DECODE() dans Oracle est utile lorsque nous voulons évaluer plusieurs conditions dans un tableau.

Dans l'exemple ci-dessous, nous avons utilisé l'instruction imbriquée DECODE() pour classer les employés en fonction de leur département et de leur salaire.

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

Exemple de tableau résultant de l'utilisation de l'instruction SQL imbriquée DECODE() dans Oracle

Exemple de sortie de tableau après utilisation de la fonction imbriquée DECODE(). Image par l'auteur

Comment DECODE() gère les valeurs NULL

La fonction DECODE() traite également les valeurs NULL de deux manières différentes. D'une part, DECODE() fait comme si deux valeurs NULL étaient équivalentes. Cette fonctionnalité signifie que les valeurs de NULL sont considérées comme correspondantes lorsque l'on compare les valeurs de la colonne à NULL. Toutefois, vous devez être attentif aux résultats inattendus lorsque le site NULL n'est pas explicitement pris en compte, car il peut masquer les valeurs du site NULL lors de la transformation.

Vous devez également savoir que, tout comme l'instruction CASE WHEN, la fonction DECODE() renvoie une valeur NULL si aucune correspondance n'est trouvée.

L'exemple ci-dessous montre comment la fonction DECODE() renvoie des valeurs nulles lorsque department_id et salary sont manquants.

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

Exemple de sortie de tableau utilisant la fonction SQL DECODE() pour traiter les valeurs NULL.

Exemple de sortie de tableau après utilisation de DECODE() pour gérer les valeurs NULL. Image par l'auteur

DECODE vs. CASE WHEN dans Oracle

La fonction DECODE() a été la première à être introduite, et même si elle a été remplacée par la déclaration CASE WHEN, elle est encore préférée dans certains contextes. Par exemple, la syntaxe de la fonction DECODE() est plus simple, donc si la logique est relativement simple, elle est plus facile à lire et à comprendre. 

En outre, la fonction DECODE() est généralement plus rapide car ses performances ont été optimisées en tant que fonction intégrée, bien que la différence puisse être négligeable. Enfin, dans les anciens systèmes Oracle, il se peut que vous deviez utiliser la fonction DECODE() comme fonction intégrée. 

Alternatives à DECODE() dans d'autres bases de données

La fonction DECODE() n'est prise en charge que dans la base de données Oracle. Cependant, SQL Server, PostgreSQL et MySQL proposent d'autres méthodes pour appliquer la logique de transformation conditionnelle des données.

La fonction DECODE() est utile dans la transformation des données car elle simplifie la logique complexe en éliminant l'utilisation des instructions IF ELSE ou CASE. La fonction DECODE() améliore également la lisibilité des requêtes et permet une manipulation efficace des données. Examinons les différents cas d'utilisation de la fonction DECODE().

Utilisation de CASE WHEN dans SQL Server, PostgreSQL et MySQL

L'instruction CASE WHEN offre une alternative à la fonction DECODE() pour effectuer la transformation logique conditionnelle de SQL. La syntaxe et l'implémentation de CASE WHEN sont cohérentes entre les bases de données SQL Server, PostgreSQL et MySQL.

L'exemple ci-dessous montre comment utiliser l'instruction CASE WHEN pour transformer des données dans l'instruction SELECT. La requête montre également comment combiner l'instruction CASE WHEN avec d'autres fonctions SQL pour une transformation conditionnelle complexe.

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

Conclusion et formation complémentaire

Il est important de comprendre la fonction Oracle DECODE() pour apprendre à transformer efficacement les données. La fonction DECODE() offre plusieurs cas d'utilisation pour l'application d'une logique conditionnelle pendant la transformation des données. Il est également important que vous appreniez la transformation conditionnelle alternative dans les bases de données SQL Server, PostgreSQL et MySQL. Je vous encourage à pratiquer la fonction DECODE() en utilisant différents ensembles de données et cas d'utilisation pour perfectionner vos compétences en matière de transformation des données.

Si vous souhaitez améliorer vos compétences en matière d'analyse de données, je vous recommande de suivre la formation Reporting in SQL de DataCamp pour renforcer vos compétences en matière d'analyse et de présentation. De même, vous devriez consulter notre parcours Associate Data Analyst in SQL pour vous aider à maintenir la progression du SQL nécessaire dans votre carrière d'analyste de données. Enfin, je vous recommande vivement de suivre le projet Data-Driven Decision Making in SQL de DataCamp pour démontrer votre maîtrise de l'utilisation de différentes techniques SQL pour l'analyse et le reporting afin de vous démarquer parmi les autres analystes de données.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Je crée des articles qui simplifient la science des données et l'analyse, en les rendant faciles à comprendre et accessibles.

Questions fréquemment posées

Qu'est-ce que la fonction SQL DECODE() ?

SQL DECODE() est une fonction utilisée pour effectuer une logique conditionnelle pour la transformation des données.

Quelles sont les bases de données qui supportent la fonction SQL DECODE() ?

Seule la base de données Oracle supporte nativement la fonction SQL DECODE(). SQL Server, PostgreSQL et MySQL autorisent les transformations conditionnelles à l'aide de l'instruction CASE WHEN.

Puis-je utiliser DECODE() avec d'autres fonctions SQL ?

La fonction Oracle DECODE() peut être utilisée avec d'autres fonctions SQL, telles que AVG(), SUM() et COUNT() pour effectuer des transformations conditionnelles avancées.

Puis-je utiliser des instructions DECODE() imbriquées ?

Les bases de données Oracle prennent en charge les instructions imbriquées DECODE() pour une logique complexe. Toutefois, les déclarations imbriquées DECODE() plus longues peuvent devenir difficiles à gérer et à lire.

La fonction DECODE() peut-elle gérer des valeurs NULL ?

La fonction DECODE() traite les valeurs NULL par défaut et renvoie les valeurs NULL si la condition n'est pas remplie lors de la transformation des données.

Outre DECODE(), quelles sont les autres fonctions propres à Oracle ?

Parmi les autres fonctions propres à la base de données Oracle figure NVL(), qui remplace les valeurs de NULL par les valeurs spécifiées.

Sujets

Apprenez SQL avec DataCamp

Certification disponible

cours

Introduction à Oracle SQL

4 hr
11.7K
Améliorez vos compétences en Oracle SQL, y compris les bases de SQL, l'agrégation, la combinaison et la personnalisation des données.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow
Apparenté

blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates a offert plus de 20k bourses d'études à nos partenaires à but non lucratif au deuxième trimestre 2023. Découvrez comment des apprenants défavorisés et assidus ont transformé ces opportunités en réussites professionnelles qui ont changé leur vie.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

blog

Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Vous êtes actuellement à la recherche d'un emploi qui utilise Snowflake ? Préparez-vous à répondre à ces 20 questions d'entretien sur le flocon de neige pour décrocher le poste !
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 min

blog

Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024

Un guide complet pour explorer les questions d'entretien AWS de base, intermédiaires et avancées, ainsi que des questions basées sur des situations réelles. Il couvre tous les domaines, garantissant ainsi une stratégie de préparation bien équilibrée.
Zoumana Keita 's photo

Zoumana Keita

30 min

blog

2022-2023 Rapport annuel DataCamp Classrooms

À l'aube de la nouvelle année scolaire, DataCamp Classrooms est plus motivé que jamais pour démocratiser l'apprentissage des données, avec plus de 7 650 nouveaux Classrooms ajoutés au cours des 12 derniers mois.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 min

blog

Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Découvrez le parcours inspirant de Saghar Hazinyar, diplômée de Code to Inspire, qui a surmonté les défis en Afghanistan et s'est épanouie grâce à une bourse de DataCamp Donates.
Fereshteh Forough's photo

Fereshteh Forough

4 min

blog

Nous avons fait don de bourses DataCamp Premium à un million de personnes, et ce n'est pas fini.

Réparties entre nos deux programmes d'impact social, DataCamp Classrooms et #DCDonates, les bourses offrent un accès illimité à tout ce que DataCamp Premium a à offrir.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Voir plusVoir plus