Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

  1. Accueil
  2. Blog
  3. Bases de données et SQL

Bases de données et SQL

Instruction SQL CASE WHEN : Syntaxe, exemples réels et erreurs courantes

CASE WHEN est la façon dont vous écrivez la logique si-alors en SQL. Apprenez les deux formulaires, puis utilisez-les pour les étiquettes, les rapports de style pivot, le tri personnalisé et les mises à jour sécurisées, tout en évitant les pièges NULL et de classement.

8 min de lecture
Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

À retenir

  • CASE renvoie une valeur basée sur la première condition qui est vraie.
  • Mettez les conditions les plus spécifiques en premier, sinon les conditions ultérieures risquent de ne jamais être atteintes.
  • Sans ELSE, les lignes sans correspondance renvoient NULL.
  • Dans SUM ou COUNT, CASE transforme une requête en un rapport compact de style pivot.

La plupart des rapports nécessitent une certaine logique : étiquetez les commandes comme étant grandes ou petites, comptez côte à côte les commandes payées et en attente, ou affichez en premier les articles urgents. SQL CASE WHEN gère tout cela directement dans une requête et fonctionne sur toutes les principales bases de données.

Nous avons exécuté chaque requête ici dans SQLite 3.50, et les résultats affichés proviennent de cette exécution. CASE fait partie du SQL standard, il se comporte donc de la même manière dans PostgreSQL, MySQL, SQL Server et Oracle pour ces exemples.

Qu’est-ce que CAS QUAND ?

CASE est une expression, pas une commande distincte. Il évalue les conditions dans l’ordre et renvoie une valeur, de sorte qu’il peut aller partout où une valeur est autorisée : dans SELECT, WHERE, GROUP BY, ORDER BY ou à l’intérieur des fonctions. Il se termine toujours par END.

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ELSE fallback
END

Le tableau exemple

CREATE TABLE orders (id INT, customer TEXT, total INT, status TEXT);

INSERT INTO orders VALUES
 (1,'Asha',1200,'paid'), (2,'Ben',300,'pending'),
 (3,'Asha',800,'paid'), (4,'Chitra',2500,'shipped'),
 (5,'Dev',150,'cancelled'), (6,'Ben',NULL,'pending');

Notez que l’ordre 6 n’a pas de total. Cette ligne compte plus tard.

CAS recherché

Il s’agit de la forme la plus flexible, puisque chaque WHEN a sa propre condition :

SELECT id, total,
       CASE
         WHEN total >= 1000 THEN 'large'
         WHEN total >= 500 THEN 'medium'
         ELSE 'small'
       END AS size
FROM orders;

-- 1 | 1200 | large
-- 2 |  300 | small
-- 3 |  800 | medium
-- 4 | 2500 | large
-- 5 |  150 | small
-- 6 | NULL | small

Regardez la dernière ligne. L’ordre 6 n’a pas de total, mais il est étiqueté « petit ». Les deux comparaisons avec NULL n’étaient pas vraies, donc elles sont tombées sur ELSE. Nous montrons comment résoudre ce problème dans la section NULL. Donnez toujours un nom au résultat en utilisant AS, sinon vous risquez d’obtenir un nom de colonne maladroit.

CAS SIMPLE

Lorsque vous comparez une colonne avec des valeurs fixes, la forme la plus courte se lit mieux :

SELECT id,
       CASE status
         WHEN 'paid' THEN 'Complete'
         WHEN 'shipped' THEN 'Complete'
         WHEN 'pending' THEN 'Waiting'
       END AS label
FROM orders;

-- 1 | Complete
-- 2 | Waiting
-- 3 | Complete
-- 4 | Complete
-- 5 | NULL
-- 6 | Waiting
Formulaire Compare Peut-on utiliser des gammes ? Idéal pour
Simple Une expression pour l’égalité Non Mappage des codes aux étiquettes
Recherché Toute condition par branche Oui Plages, plusieurs colonnes, vérifications NULL

L’ordre compte

CASE s’arrête à la première condition vraie, et c’est le bug logique le plus courant. Échangez les deux conditions de notre requête précédente :

SELECT id, total,
       CASE
         WHEN total >= 500 THEN 'medium'
         WHEN total >= 1000 THEN 'large'
         ELSE 'small'
       END AS size
FROM orders WHERE id IN (1, 4);

-- 1 | 1200 | medium
-- 4 | 2500 | medium

Désormais, rien ne peut jamais être « grand ». Un total de 2 500 fait également au moins 500, donc la première branche gagne et la seconde n’est jamais atteinte. Aucune erreur n’apparaît, seulement des étiquettes erronées. Pour les plages, placez la condition la plus restrictive en premier ou écrivez des plages complètes, telles que total >= 500 AND total < 1000.

Que se passe-t-il sans ELSE ?

Dans notre exemple CASE simple ci-dessus, la commande 5 a été annulée et aucune branche ne l’a géré, le résultat était donc NULL. Parfois, c’est exactement ce que vous souhaitez, comme le montre la section suivante. Mais lors de la création d’étiquettes, un ELSE 'other' clair est généralement préférable, car il rend visibles les valeurs inattendues plutôt que de laisser des blancs dans un rapport.

Astuce : Toutes les branches doivent renvoyer le même type. Le mélange de texte et de chiffres fonctionne de manière vague dans SQLite, mais des bases de données plus strictes, telles que PostgreSQL, généreront une erreur ou tenteront de convertir les valeurs d’une manière que vous n’aviez pas prévue.

Rapports de style pivot avec SUM

C’est l’un des modèles les plus utiles du SQL quotidien. Englober CASE dans un agrégat transforme les lignes en colonnes, avec une ligne par client :

SELECT customer,
       SUM(CASE WHEN status = 'paid' THEN total ELSE 0 END) AS paid,
       SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders
FROM orders
GROUP BY customer
ORDER BY customer;

-- Asha   | 2000 | 0
-- Ben    |    0 | 2
-- Chitra |    0 | 0
-- Dev    |    0 | 0

Une seule requête donne désormais à la fois les revenus payés et le nombre de commandes en attente, sans avoir besoin de requêtes ou de jointures distinctes. Le modèle fonctionne dans presque toutes les bases de données, contrairement à la syntaxe dédiée PIVOT que seules certaines proposent. Si GROUP BY est nouveau pour vous, lisez SQL GROUP BY et HAVING.

Comptes conditionnels

COUNT ignore les valeurs NULL, donc un CASE sans ELSE ne compte que les lignes qui correspondent :

SELECT COUNT(*) AS all_orders,
       COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
       COUNT(CASE WHEN total >= 1000 THEN 1 END) AS large_orders
FROM orders;

-- 6 | 2 | 2

Attention : si vous ajoutez ELSE 0 à l’intérieur d’un COUNT, chaque ligne est comptée, car 0 n’est pas NULL. Utilisez ELSE 0 avec SUM et laissez-le de côté avec COUNT. PostgreSQL et SQLite prennent également en charge COUNT(*) FILTER (WHERE ...), qui se lit bien, mais il n’est pas disponible partout.

Regroupement par un CASE

Vous pouvez créer vos propres buckets, puis les résumer :

SELECT CASE WHEN total >= 1000 THEN 'large' ELSE 'other' END AS bucket,
       COUNT(*)
FROM orders
GROUP BY bucket
ORDER BY bucket;

-- large | 2
-- other | 4

Le regroupement par alias fonctionne dans SQLite, PostgreSQL et MySQL. SQL Server ne le permet pas, vous devrez donc d’abord répéter l’expression entière ou placer la requête dans un CTE ou une sous-requête.

Tri personnalisé avec ORDER BY

L’ordre alphabétique est rarement ce qu’une entreprise souhaite. CASE vous permet de définir votre propre commande :

SELECT id, status FROM orders
ORDER BY CASE status
           WHEN 'pending' THEN 1
           WHEN 'paid' THEN 2
           ELSE 3
         END, id;

-- 2 | pending
-- 6 | pending
-- 1 | paid
-- 3 | paid
-- 4 | shipped
-- 5 | cancelled

Les commandes en attente viennent en premier, ce qui est pratique pour une file d’attente de travail. La deuxième colonne de tri, id, conserve les lignes dans un ordre prévisible au sein de chaque groupe.

CAS en MISE À JOUR

CASE permet à une instruction d’appliquer différentes modifications à différentes lignes. Ici, les petites commandes en attente sont signalées pour examen :

UPDATE orders
SET status = CASE
               WHEN status = 'pending' AND total < 500 THEN 'review'
               ELSE status
             END;

SELECT id, status FROM orders WHERE customer = 'Ben';

-- 2 | review
-- 6 | pending

Le ELSE status conserve les autres lignes inchangées. Le laisser de côté est dangereux, car les lignes sans correspondance seraient définies sur NULL. Sans clause WHERE, cette instruction touche également chaque ligne, donc sur les grandes tables, ajoutez un filtre et envisagez d’encapsuler la modification dans une transaction afin de pouvoir vérifier le résultat avant de valider. Notez également que l’ordre 6 n’a pas changé, car son total NULL ne satisfaisait pas total < 500.

Pièges NULL

NULL provoque deux problèmes distincts avec CASE. Premièrement, la forme simple compare en utilisant l’égalité, et rien n’est égal à NULL, pas même NULL lui-même :

SELECT CASE NULL WHEN NULL THEN 'matched' ELSE 'not matched' END;

-- not matched

Donc CASE col WHEN NULL ne correspond jamais. Utilisez plutôt le formulaire recherché avec IS NULL. Deuxièmement, comme nous l’avons vu avec l’ordre 6, une valeur NULL échappe aux comparaisons et atterrit dans ELSE. La solution consiste à le vérifier d’abord :

SELECT id,
       CASE
         WHEN total IS NULL THEN 'unknown'
         WHEN total >= 1000 THEN 'large'
         ELSE 'other'
       END AS size
FROM orders WHERE id IN (1, 2, 6);

-- 1 | large
-- 2 | other
-- 6 | unknown

La commande 6 reçoit désormais une étiquette honnête. Notre guide sur les Valeurs SQL NULL couvre ce comportement dans son intégralité.

CAS vs autres options

Options Fonctionne dans Utilisez-le quand
CAS Toutes les principales bases de données Vous voulez une logique portable
COALESCER Toutes les principales bases de données Vous n’avez besoin que d’une solution de secours pour NULL
IF() MySQL Un choix simple à double sens
IIF() SQL Server, SQLite Un choix simple à double sens
DECODE() Oracle Ancien code Oracle
Table de recherche Tout La cartographie est longue ou change souvent

Cette dernière option mérite réflexion. Si un CASE atteint trente branches et apparaît dans cinq requêtes, déplacez le mappage dans une table et rejoignez-y. Un changement consiste alors en une mise à jour d’une seule ligne, plutôt qu’en un changement de code à cinq endroits.

Erreurs courantes

  • Mauvais ordre des conditions. Une condition générale masque d’abord les conditions plus étroites.
  • Oublier END. C’est l’erreur de syntaxe la plus fréquente.
  • Utilisation de WHEN NULL. Cela ne correspond jamais, alors utilisez WHEN col IS NULL.
  • Ajout de ELSE 0 à l’intérieur de COUNT. Il compte toutes les lignes.
  • Omettre ELSE dans une MISE À JOUR. Il peut effacer les valeurs avec NULL.
  • Filtrage par CASE dans WHERE. Il peut empêcher l’utilisation d’un index. Consultez notre guide sur l’optimisation des requêtes SQL.

Pour conclure

CASE WHEN est une petite fonctionnalité qui fait beaucoup de travail. N’oubliez pas trois règles : la première vraie branche gagne, les lignes sans correspondance deviennent NULL sans ELSE et NULL a besoin de sa propre vérification. Pour vous entraîner, prenez un rapport que vous construisez actuellement avec plusieurs requêtes et essayez de le produire comme une seule requête en utilisant SUM(CASE ...).

Questions fréquentes

Que fait CASE WHEN en SQL ?

Il ajoute une logique si-alors à une requête. SQL vérifie chaque condition dans l’ordre et renvoie la valeur de la première qui est vraie, ou la valeur ELSE si aucune ne l’est.

Que se passe-t-il s’il n’y a pas de ELSE dans une instruction CASE ?

Les lignes qui ne correspondent à aucune condition renvoient NULL. Ceci est utile dans COUNT, mais dans les étiquettes et les mises à jour, cela peut entraîner des blancs ou des pertes de données.

Puis-je utiliser CASE dans une clause WHERE ?

Oui, parce que c’est une expression. Cependant, les conditions AND et OR simples sont généralement plus claires et sont plus susceptibles d’utiliser un index.

Quelle est la différence entre CASE simple et CASE recherché ?

Simple CASE compare une expression avec des valeurs fixes pour l’égalité. CASE recherché a une condition complète dans chaque WHEN, il peut donc gérer les plages et les vérifications NULL.

Les instructions CASE peuvent-elles être imbriquées ?

Oui, un CASE peut apparaître dans un autre. Cependant, l’imbrication profonde devient difficile à lire, alors pensez à combiner les conditions avec AND ou à utiliser une table de recherche.

Continuez à apprendre

Travailler avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le référencement ?

Nous aidons les équipes à proposer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous vous proposerons une prochaine étape claire.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Tests logiciels

Tests d'acceptation utilisateur (UAT) : processus, liste de contrôle et exemples réels

Les tests d'acceptation des utilisateurs sont expliqués : qui les exécute, en quoi ils diffèrent du contrôle qualité, un processus en sept étapes, u…

Lire l'article →
Bases de données et SQL

Explication des valeurs SQL NULL : IS NULL, COALESCE, NULLIF et les pièges à éviter

Les valeurs SQL NULL expliquées avec les requêtes que nous avons exécutées : logique à trois valeurs, IS NULL, COALESCE, NULLIF, comment les agrégat…

Lire l'article →
Bases de données et SQL

Instruction SQL CASE WHEN : syntaxe, exemples réels et erreurs courantes

SQL CASE WHEN expliqué avec les requêtes que nous avons exécutées : formulaires simples et recherchés, ordre des conditions, pivots avec SUM, astuce…

Lire l'article →
Développement logiciel

Qu'est-ce que JWT ? Les jetons Web JSON expliqués avec un exemple fonctionnel

Qu’est-ce que JWT ? JSON Web Tokens expliqué : les trois parties, un jeton construit et falsifié dans le code que nous avons exécuté, JWT vs session…

Lire l'article →
Développement logiciel

Boucle d'événements JavaScript expliquée : pile d'appels, microtâches et minuteries avec des exemples

La boucle d'événements JavaScript expliquée avec le code que nous avons exécuté : pile d'appels, files d'attente de tâches et de microtâches, pourqu…

Lire l'article →
Développement logiciel

Générateurs Python et rendement expliqués : économisez de la mémoire avec des exemples réels

Les générateurs Python et le rendement expliqués avec le code que nous avons exécuté : comment ils s'arrêtent et reprennent, les économies de mémoir…

Lire l'article →
Intelligence artificielle

Que sont les intégrations ? Vecteurs et similarité cosinus expliqués simplement

Que sont les intégrations ? Un guide en langage simple sur les vecteurs, la similarité cosinus et la recherche sémantique, avec un petit exemple que…

Lire l'article →
DevOps

Déploiement Bleu-Vert vs Canary : différences, compromis et comment choisir

Explication du déploiement bleu-vert ou canari : comment chacun fonctionne, coût, risque et restauration, regroupement d'utilisateurs stable que nou…

Lire l'article →
Automatisation des tests

Tests instables : quelles sont leurs causes et comment les corriger définitivement

Des tests irréguliers expliqués avec des démos que nous avons exécutées : les principales causes, comment en confirmer et en diagnostiquer une, les …

Lire l'article →
Tests logiciels

Tests de charge vs tests de contrainte : différences, métriques et exemples k6

Explication des tests de charge et des tests de stress : ce que chacun prouve, les tests de pointe et de trempage, les métriques qui comptent, pourq…

Lire l'article →
Tests logiciels

Scénario de test et scénario de test : principales différences, exemples et quand les utiliser

Scénario de test et scénario de test expliqués : des définitions claires, un tableau côte à côte, une fonctionnalité de réinitialisation de mot de p…

Lire l'article →
Bases de données et SQL

Optimisation des requêtes SQL : lire les plans d'exécution et corriger les requêtes lentes, avec des délais

Optimisation des requêtes SQL testée sur un million de lignes : lire les plans d'exécution, ajouter les bons index, corriger les filtres non Sargabl…

Lire l'article →
Bases de données et SQL

SQL UNION vs UNION ALL : différences, exemples et performances testées

SQL UNION vs UNION ALL expliqué avec les requêtes que nous avons exécutées : des doublons, les règles suivent toutes les deux, un véritable bug de d…

Lire l'article →
Développement logiciel

Tutoriel API JavaScript Fetch : GET, POST, gestion des erreurs et délais d'attente

Un didacticiel de l'API JavaScript Fetch testé sur un serveur local : GET et POST, pourquoi 404 ne lance pas, un assistant réutilisable, des chaînes…

Lire l'article →
Développement logiciel

Gestion des fichiers Python : lecture, écriture, CSV, JSON et pathlib avec exemples

Gestion des fichiers Python expliquée avec le code que nous avons exécuté : modes ouverts, avec lecture de fichiers volumineux, CSV, JSON, pathlib, …

Lire l'article →
Développement logiciel

Classes et objets Python : didacticiel POO avec des exemples réels

Classes et objets Python expliqués avec le code que nous avons exécuté : __init__, méthodes, attributs de classe par rapport à l'instance, héritage,…

Lire l'article →
Intelligence artificielle

Qu'est-ce qu'un grand modèle de langage ? Comment fonctionnent les LLM, expliqués sans battage médiatique

Qu’est-ce qu’un grand modèle de langage ? Les LLM expliqués en langage simple : jetons, intégrations, attention, formation, fenêtres de température …

Lire l'article →
DevOps

Commandes Linux pour les débutants : le guide du terminal essentiel avec des exemples

Commandes Linux pour débutants, regroupées par tâche : navigation, fichiers, affichage des journaux, grep, tuyaux, autorisations, processus et archi…

Lire l'article →
Automatisation des tests

Selenium vs Playwright : principales différences, code comparé et lequel choisir

Comparatif Selenium vs Playwright : architecture, attente, support du navigateur et du langage, débogage, même test dans les deux outils, conseils d…

Lire l'article →
Tests logiciels

Partitionnement d'équivalence : technique de conception de tests expliquée avec des exemples concrets

Le partitionnement d'équivalence expliqué : comment trouver des partitions valides et invalides, des exemples concrets d'âges, de mots de passe et d…

Lire l'article →
Tests logiciels

Gravité vs priorité dans les tests logiciels : différences, matrice et exemples réels

Explication de la gravité et de la priorité dans les tests logiciels : des définitions claires, une matrice à quatre voies avec des exemples, des éc…

Lire l'article →
Bases de données et SQL

Tutoriel sur les sous-requêtes SQL : types, sous-requêtes corrélées et EXISTE avec des exemples

Un didacticiel sur les sous-requêtes SQL avec les requêtes que nous avons exécutées : les sous-requêtes scalaires, IN, FROM et SELECT, les sous-requ…

Lire l'article →
Bases de données et SQL

Transactions SQL et ACID expliquées : COMMIT, ROLLBACK et niveaux d'isolement

Transactions SQL et ACID expliquées avec un virement bancaire que nous avons effectué : COMMIT, ROLLBACK, points de sauvegarde, verrous, niveaux d'i…

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →