Guide détaillé de l'utilisation de CASE WHEN en SQL

Formes de CASE WHEN en SQL

La clause CASE WHEN permet d'effectuer des retours conditionnels dans les requêtes SQL. Deux variantes principales existent : simple et conditionnelle, chacune adaptée à des scénarios différents.

  1. Fonction CASE WHEN simple

Cette forme compare une expression à des valeurs explicites. Elle est utile pour des correspondances directes, mais limitée en flexibilité.

CASE GRADE WHEN 'A' THEN 'Excellent' ELSE 'Insuffisant' END

-- Alternative avec la fonction IF
IF(GRADE = 'A', 'Excellent', 'Insuffisant')

Important : Les types des valeurs retournées après THEN et ELSE doivent être identiques, sinon une erreur de type survient. Par exemple, tenter de retourner une chaîne et un nombre causera une incohérence.

  1. Fonction CASE WHEN conditionnelle

Plus puissante, cette forme évalue des conditions booléennes, similaire à une structure IF-ELSE en langages de programmation.

CASE 
    WHEN GRADE = 'A' THEN 'Excellent'
    WHEN GRADE = 'B' THEN 'Bien'
    WHEN GRADE = 'C' THEN 'Moyen' 
    ELSE 'Insuffisant' END

Les conditions sont évaluées séquentiellement. Si toutes sont fausses, la valeur après ELSE est retournée ; si ELSE est absent, NULL est renvoyé.

  1. Scénarios d'application courants

Pour illustrer, considérons un jeu de données simplifié. Les exemples suivants utilisent des tables redéfinies pour éviter la similarité directe avec le matériel original.

Scénario 1 : Transformation de valeurs selon des seuils

L'objectif est de catégoriser les scores en catégories textuelles.

SELECT
    nom_etudiant,
    (CASE WHEN score_etu < 60 THEN 'Insuffisant'
        WHEN score_etu >= 60 AND score_etu < 80 THEN 'Passable'
        WHEN score_etu >= 80 THEN 'Excellent'
        ELSE 'Non défini' END) AS CATEGORIE
FROM etudiants;

Note : Pour gérer les valeurs NULL, utilisez l'opérateur IS NULL au lieu d'une comparaison directe avec NULL.

Scénario 2 : Statistiques par groupes avec agrégation

Ici, on comptabilise les éléments par catégorie tout en filtrant selon des conditions multiples.

SELECT
    SUM(CASE WHEN genre = 0 THEN 1 ELSE 0 END) AS NOMBRE_HOMMES,
    SUM(CASE WHEN genre = 1 THEN 1 ELSE 0 END) AS NOMBRE_FEMMES,
    SUM(CASE WHEN score_etu >= 60 AND genre = 0 THEN 1 ELSE 0 END) AS HOMMES_REUSSITE,
    SUM(CASE WHEN score_etu >= 60 AND genre = 1 THEN 1 ELSE 0 END) AS FEMMES_REUSSITE
FROM etudiants;

La fonction SUM avec des valeurs 0 et 1 est courante pour le comptage conditionnel. Veillez à conserver le type numérique pour éviter des erreurs de calcul.

Scénario 3 : Agrégation croisée avec CASE WHEN

Ce cas illustre la somme de valeurs regroupées par catégorie, créant un résumé tabulaire.

SELECT code_region,
       SUM(CASE WHEN type_consommation = 'eau' THEN valeur ELSE 0 END) AS CONSOMMATION_EAU,
       SUM(CASE WHEN type_consommation = 'electricite' THEN valeur ELSE 0 END) AS CONSOMMATION_ELECTRIQUE,
       SUM(CASE WHEN type_consommation = 'chaleur' THEN valeur ELSE 0 END) AS CONSOMMATION_CHALEUR
FROM mesures_energie
GROUP BY code_region;

Scénario 4 : Intégration de sous-requêtes dans CASE WHEN

Ce scénario montre comment utiliser des sous-requêtes pour déterminer dynamiquement les valeurs de retour basées sur d'autres tables.

SELECT code_energie, valeur_mesure,
     (CASE 
        WHEN valeur_mesure <= (SELECT seuil FROM tarifs WHERE niveau = 1)
            THEN (SELECT prix_unitaire FROM tarifs WHERE niveau = 1)
        WHEN valeur_mesure > (SELECT seuil FROM tarifs WHERE niveau = 1) 
             AND valeur_mesure <= (SELECT seuil FROM tarifs WHERE niveau = 2)
            THEN (SELECT prix_unitaire FROM tarifs WHERE niveau = 2)
        WHEN valeur_mesure > (SELECT seuil FROM tarifs WHERE niveau = 2)
            THEN (SELECT prix_unitaire FROM tarifs WHERE niveau = 3)
     END) AS cout_estime
FROM mesures_energie
WHERE type_consommation = 'electricite';

Scénario 5 : Transformation de lignes en colonnes avec agrégation

Cette technique, souvent appelée pivot, utilise MAX et CASE WHEN pour restructurer les données.

SELECT
    MAX(CASE WHEN colonne = 'REF_INSTALLATION' THEN description ELSE '' END) AS DESC_REF_INSTALLATION,
    MAX(CASE WHEN colonne = 'CONSOMMATION_EAU' THEN description ELSE '' END) AS DESC_CONSOMMATION_EAU,
    MAX(CASE WHEN colonne = 'CONSOMMATION_CHALEUR' THEN description ELSE '' END) AS DESC_CONSOMMATION_CHALEUR,
    MAX(CASE WHEN colonne = 'COMMENTAIRE' THEN description ELSE '' END) AS DESC_COMMENTAIRE
FROM metadonnees_colonnes;

L'agrégation (ici MAX) est nécessaire pour résoudre les multiples lignes en une seule sortie. MIN peut également être utilisé selon le contexte.

Étiquettes: SQL CASE WHEN Expressions conditionnelles Requêtes agrégées Sous-requêtes

Publié le 8 juin à 00h08