Niveau 11 : Conditions dans le résultat : CASE

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

Table movies (10 lignes)
idtitlegenreyeardurationratingdirector_id
1Night TrainThriller20151187.81
2Blue HarborDrama20181027.12
3Paper Moon CityComedy2012956.45
4Silent PeakDrama20201318.23
5Last SignalSci-Fi20191427.51
6Summer KeysComedy2016885.94
7Iron GardenSci-Fi202112583
8Dust and GoldWestern20141106.82
9The Quiet HourDrama2022977.45
10Deep CurrentThriller20171056.9NULL

Résultat de l’exemple

titleratingverdict
Night Train7.8top
Blue Harbor7.1good
Paper Moon City6.4average
Silent Peak8.2top
Last Signal7.5top
Summer Keys5.9average
Iron Garden8top
Dust and Gold6.8good
The Quiet Hour7.4good
Deep Current6.9good

À 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

  1. Guidé · 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. (Table : products)
  2. Entraînement · 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é. (Table : matches)
  3. Entraînement · 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. (Table : rooms)
  4. Entraînement · En une seule ligne, affiche le nombre de notes d'au moins 10 (passed) et le nombre de notes inférieures à 10 (failed). (Table : grades)
  5. Défi · Classe les vols en 'full' (au moins 90 % des places vendues) ou 'not full', et affiche le nombre de vols de chaque catégorie. (Table : flights)

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.

Ouvrir le niveau 11 dans SpeedQL

·