L’expression CASE
Une logique IF/THEN à l’intérieur d’une requête.
L’expression CASE est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Logique conditionnelle en SQL
Vous devez parfois demander à une requête de prendre une décision : si ceci, alors cela, sinon autre chose. SQL fournit l'expression CASE précisément pour cela.
CASE vous permet de renvoyer des valeurs différentes selon les conditions, directement dans un SELECT. Considérez-la comme l'équivalent SQL d'une chaîne if/else.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Anatomie de CASE
Une expression CASE comporte plusieurs éléments :
WHEN condition THEN value— une ou plusieurs branchesELSE value— une valeur de repli facultativeEND— ferme l'expression (obligatoire !)
SQL évalue les branches WHEN de haut en bas et renvoie la valeur de la première branche vraie.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE renvoie une valeur
L'idée essentielle est la suivante : une expression CASE produit une seule valeur par ligne. Comme elle produit une valeur, vous pouvez l'utiliser partout où une valeur est autorisée : dans la liste SELECT, dans WHERE, dans ORDER BY, et même à l'intérieur de fonctions.
Ici, elle attribue un statut simple à chaque commande.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;La première correspondance l'emporte
L'ordre est important. SQL vérifie chaque WHEN dans l'ordre et s'arrête à la première condition vraie. Les branches suivantes sont ignorées, même si elles correspondent également.
Ci-dessous, une commande supérieure à 1000 est 'importante', et jamais 'moyenne', car la première branche correspondante l'emporte.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;La branche ELSE
La branche ELSE est la branche générale. Si aucune condition WHEN n'est vraie, CASE renvoie la valeur de ELSE.
Si vous omettez ELSE et qu'aucune condition ne correspond, CASE renvoie NULL. C'est une source fréquente de NULL inattendus : ajoutez donc un ELSE explicite lorsque vous voulez une valeur de repli définie.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Les conditions peuvent être quelconques
Une condition WHEN est simplement une expression booléenne — du même type que celle que vous écrivez dans une clause WHERE. Vous pouvez utiliser des comparaisons, AND, OR, BETWEEN, IN, LIKE et bien d'autres éléments.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Les types de résultat doivent être compatibles
Chaque branche d'un CASE doit renvoyer des valeurs d'un type compatible, car la colonne doit avoir un type unique. Mélanger du texte et des nombres provoquera une erreur ou une conversion de type inattendue.
Si vous avez besoin de nombres dans une branche et de texte dans une autre, effectuez explicitement une conversion de type afin d'aligner les types.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Utiliser CASE dans WHERE
Comme CASE produit une valeur, vous pouvez comparer son résultat dans une clause WHERE. Cela est pratique pour les règles de filtrage dynamiques.
Toutefois, une logique booléenne simple dans WHERE est souvent plus claire : utilisez CASE dans WHERE uniquement lorsque les branches simplifient réellement la condition.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Imbriquer CASE
Vous pouvez placer un CASE à l'intérieur d'une autre branche CASE pour exprimer une logique à plusieurs niveaux. Cela fonctionne, mais les expressions profondément imbriquées deviennent difficiles à lire.
Limitez la profondeur d'imbrication : si elle augmente, une colonne distincte ou une table de correspondance est généralement plus claire.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE avec des agrégats
Voici un modèle puissant : placez un CASE à l'intérieur d'un agrégat comme SUM ou COUNT. Cela permet de compter ou d'additionner les lignes selon une condition en un seul parcours — on parle parfois d'agrégation conditionnelle ou de tableau croisé.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE renvoyant NULL volontairement
Renvoyer NULL depuis une branche est parfois exactement ce qu'il vous faut — par exemple pour masquer une valeur que vous ne voulez pas afficher, ou pour alimenter un agrégat ultérieur qui ignore les NULL.
Ici, seules les commandes importantes conservent leur total ; les autres deviennent NULL, afin que AVG les ignore.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Vérification rapide
Considérez cette expression pour une ligne où total = 1500 :
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Quelle valeur renvoie-t-elle ?
Récapitulatif : l’expression CASE
Vous avez appris les bases de la logique conditionnelle en SQL :
CASE WHEN ... THEN ... ELSE ... ENDrenvoie une valeur par ligne- Les branches sont vérifiées de haut en bas ; la première correspondance l’emporte
- Omettre
ELSErenvoieNULLlorsqu’aucune correspondance n’est trouvée - Toutes les branches doivent renvoyer des types compatibles
CASEfonctionne dansSELECT,WHEREet à l’intérieur des fonctions d’agrégation
Ensuite, nous comparerons les deux formes syntaxiques de CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Questions Fréquemment Posées
La leçon « L’expression CASE » est-elle gratuite ?
Oui — le texte complet de « L’expression CASE » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « L’expression CASE » ?
Une logique IF/THEN à l’intérieur d’une requête. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « L’expression CASE » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- L’expression CASE
- CASE recherché ou simple
- Regrouper et étiqueter les données
- CASE dans ORDER BY et les agrégations