Niveau 11 : Conditions dans le résultat : CASE
Mis à jour le
Intermédiaire · niveau 11 sur 20. Objectif : Calculer une valeur différente selon une condition, et compter des lignes par catégorie.
Notions : CASE WHEN … THEN … ELSE … END comptage conditionnel
Leçon
CASE fonctionne comme un « si… alors… sinon » : il calcule une valeur différente selon une condition. Sa forme : CASE WHEN condition THEN valeur WHEN autre_condition THEN autre_valeur ELSE valeur_par_défaut END. Le tout produit une seule valeur, à laquelle on donne un alias.
Les conditions sont testées dans l'ordre, et la première vraie l'emporte : les suivantes ne sont pas regardées. L'ordre compte donc. Avec WHEN rating >= 6.5 THEN 'good' écrit en premier, un film noté 8.2 recevrait 'good' et jamais 'top'. Écris les conditions de la plus exigeante à la moins exigeante.
Sans ELSE, une ligne qui ne vérifie aucune condition reçoit NULL. Un ELSE explicite évite les surprises.
CASE s'utilise partout où l'on peut mettre une valeur. Dans le SELECT, il crée une catégorie. Dans un GROUP BY, il regroupe par catégorie : combien de vols pleins, combien de vols non pleins. Dans un ORDER BY, il impose un ordre personnalisé.
Dans un agrégat, il permet le comptage conditionnel. SUM(CASE WHEN grade >= 10 THEN 1 ELSE 0 END) ajoute 1 pour chaque note d'au moins 10 et 0 pour les autres : on obtient le nombre de notes suffisantes. Plusieurs SUM(CASE …) dans le même SELECT comptent plusieurs catégories en une seule ligne.
Rappel utile pour les taux : diviser deux entiers donne un entier. seats_sold / capacity vaut 0 pour 150 / 180 ; seats_sold * 1.0 / capacity donne 0.833…
Syntaxe
SELECT col,
CASE
WHEN x >= 10 THEN 'haut'
WHEN x >= 5 THEN 'moyen'
ELSE 'bas'
END AS niveau
FROM ma_table;Exemple commenté
SELECT title,
rating,
CASE
WHEN rating >= 7.5 THEN 'top'
WHEN rating >= 6.5 THEN 'good'
ELSE 'average'
END AS verdict
FROM movies;Un film noté 8.2 s'arrête à la première condition vraie et reçoit 'top'.
| id | title | genre | year | duration | rating | director_id |
|---|---|---|---|---|---|---|
| 1 | Night Train | Thriller | 2015 | 118 | 7.8 | 1 |
| 2 | Blue Harbor | Drama | 2018 | 102 | 7.1 | 2 |
| 3 | Paper Moon City | Comedy | 2012 | 95 | 6.4 | 5 |
| 4 | Silent Peak | Drama | 2020 | 131 | 8.2 | 3 |
| 5 | Last Signal | Sci-Fi | 2019 | 142 | 7.5 | 1 |
| 6 | Summer Keys | Comedy | 2016 | 88 | 5.9 | 4 |
| 7 | Iron Garden | Sci-Fi | 2021 | 125 | 8 | 3 |
| 8 | Dust and Gold | Western | 2014 | 110 | 6.8 | 2 |
| 9 | The Quiet Hour | Drama | 2022 | 97 | 7.4 | 5 |
| 10 | Deep Current | Thriller | 2017 | 105 | 6.9 | NULL |
Résultat de l’exemple
| title | rating | verdict |
|---|---|---|
| Night Train | 7.8 | top |
| Blue Harbor | 7.1 | good |
| Paper Moon City | 6.4 | average |
| Silent Peak | 8.2 | top |
| Last Signal | 7.5 | top |
| Summer Keys | 5.9 | average |
| Iron Garden | 8 | top |
| Dust and Gold | 6.8 | good |
| The Quiet Hour | 7.4 | good |
| Deep Current | 6.9 | good |
À retenir
- CASE … END crée une valeur selon des conditions.
- La première condition vraie gagne.
- SUM(CASE WHEN … THEN 1 ELSE 0 END) compte sous condition.
Pièges fréquents
- Oublier END provoque une erreur de syntaxe.
- Diviser deux entiers donne un entier arrondi vers le bas : 150 / 180 vaut 0. Multiplie par 1.0 pour obtenir un taux.
Spécificité SQLite
Regrouper sur un alias (GROUP BY band) fonctionne dans SQLite, PostgreSQL et MySQL. SQL Server l'interdit et exige de répéter l'expression CASE entière dans le GROUP BY ; Oracle ne l'accepte que depuis sa version 23ai. Répéter l'expression reste la forme la plus portable.
Les 5 exercices du niveau
- Affiche le nom et le prix de chaque produit, avec une colonne price_band qui vaut 'cheap' si le prix est inférieur à 20, et 'expensive' sinon.
- Pour chaque match, affiche son identifiant et une colonne result : 'home' si l'équipe à domicile a gagné, 'away' si c'est l'équipe visiteuse, 'draw' en cas d'égalité.
- Affiche l'identifiant, le type et le prix des chambres : d'abord les suites, puis les doubles, puis les simples ; à type égal, de la plus chère à la moins chère.
- En une seule ligne, affiche le nombre de notes d'au moins 10 (passed) et le nombre de notes inférieures à 10 (failed).
- Classe les vols en 'full' (au moins 90 % des places vendues) ou 'not full', et affiche le nombre de vols de chaque catégorie.
Dans SpeedQL, chaque requête est corrigée tout de suite : le résultat est comparé à celui attendu, puis la requête est relancée sur une base de contrôle cachée. Chaque exercice a ses indices écrits, à afficher seulement si tu bloques.
Voir aussi : la fiche de l’aide-mémoire · les exercices SQL corrigés sur cette notion
Faire les exercices du niveau 11
Gratuit, sans inscription : la leçon et les 5 exercices s’ouvrent directement dans ton navigateur.
← Niveau précédent : LEFT JOIN et jointures multiples · Niveau suivant : Gérer les valeurs manquantes (NULL) →