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
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDIl 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.
-- 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 :
- Dans le
SELECTpour créer des colonnes dérivées (l'exemple ci-dessus). - Dans
ORDER BYpour un tri "personnalisé" :SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - À l'intérieur des fonctions d'agrégation pour "compter conditionnellement" :
Ce modèle -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;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 :
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDC'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
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é.
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
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).
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