Passer au contenu principal
eLearner.app
Module 4 · Leçon 3 sur 415/57 dans le cours~10 min
Leçons du module (3/4)

Logique conditionnelle : CASE WHEN

Tout ce que nous avons vu jusqu'à présent extrait les données telles quelles. Mais souvent, tu veux pour le transformer : classer les salaires en niveaux, marquer les nouvelles recrues comme "junior", traduit un code numérique en une étiquette lisible. La norme SQL L'outil pour cela s'appelle CASE WHEN.

La syntaxe : un mini if/else

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Il se lit exactement comme un if/else if/else dans n'importe quel langage : SQL évalue les conditions dans l'ordre et s'arrête à la première vraie, renvoyant le value correspondant. Si aucun n’est vrai, il renvoie la valeur ELSE. Si vous omettez le ELSE et aucune branche ne correspond, il renvoie NULL.

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

Le CASE vit à l'intérieur du SELECT : il produit une colonne comme n'importe quelle autre. fonction, et il est tout à fait normal de lui donner un alias avec AS (ici tier).

Où utiliser CASE

Trois lieux récurrents :

  1. Dans le SELECT pour créer des colonnes dérivées (l'exemple ci-dessus).
  2. Dans ORDER BY pour un tri "personnalisé" :
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. À l'intérieur des fonctions d'agrégation pour "compter conditionnellement" :
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    Ce modèle - SUM(CASE WHEN … THEN 1 ELSE 0 END) - est le plus courant « compte conditionnel » utilisé dans les tableaux de bord.

Le formulaire "compact"

Il existe également une variante plus courte lorsque vous comparez une seule expression contre des valeurs exactes :

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

C'est l'équivalent de CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, juste plus compact. Cela ne fonctionne que pour l'égalité exacte : si vous avez besoin de >= ou d'une autre comparaison, vous devez revenir à la version étendue forme.

Essayez-le

Exercice#sql.m4.l3.e1
Tentatives : 0Chargement…

Pour chaque employé, affichez le prénom (first_name), le nom (last_name) et une colonne « niveau » qui est « Alto » si le salaire est d'au moins 50 000, sinon « Standard ». Trois colonnes, une ligne par employé.

Chargement de l'éditeur…
Afficher l'indice

La condition est salaire >= 50000. Pensez à fermer le CASE avec END et à utiliser l'alias 'tier'.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#sql.m4.l3.e2
Tentatives : 0Chargement…

Pour chaque département (department_id), comptez combien d'employés ont un salaire élevé (>= 50 000) et combien d'employés ont un salaire standard (< 50 000) en utilisant SUM(CASE...). Trois colonnes : Department_id, High, Standard. Trier par Department_id (NULLS LAST).

Chargement de l'éditeur…
Afficher l'indice

Le modèle SUM(CASE WHEN ... THEN 1 ELSE 0 END) est le décompte conditionnel.

Solution disponible après 3 tentatives