Menu

SQLite : l'expression CASE WHEN, THEN, ELSE et IIF

Maîtrisez CASE en SQLite : forme simple ou avec recherche, utilisation dans SELECT, ORDER BY, WHERE, et quand préférer IIF pour aller plus vite.

Cette page contient des éditeurs exécutables — modifiez, exécutez et voyez la sortie instantanément.

CASE, c'est le If/Else du SQL

L'expression CASE en SQLite, c'est ce qui permet de glisser de la logique conditionnelle directement dans une requête. SQLite parcourt les branches WHEN dans l'ordre, retient la première qui correspond et renvoie la valeur indiquée après THEN. Si aucune branche ne matche, c'est la valeur du ELSE qui est renvoyée — ou NULL si vous n'en avez pas mis.

Le mot-clé à retenir ici, c'est expression. Un CASE produit une valeur, donc vous pouvez le placer partout où une valeur est acceptée : une colonne du SELECT, une clé de tri dans ORDER BY, le membre droit d'une comparaison, ou même un argument passé à une fonction.

Voilà la structure complète : CASE, un ou plusieurs WHEN ... THEN ..., un ELSE optionnel, puis END. Le END est obligatoire — l'oublier est l'erreur de frappe la plus fréquente.

Un exemple concret avec CASE WHEN

Imaginons une table de commandes et on veut étiqueter chaque ligne selon son montant. On va en créer une petite directement pour pouvoir lancer la requête :

Les branches sont évaluées de haut en bas. La première qui matche l'emporte, donc range-les de la plus spécifique à la plus générale. Le ELSE rattrape tout ce qui n'a pas été pris en compte — sans lui, 1200.00 ressortirait à NULL au lieu de 'grande'.

CASE recherché ou CASE simple

Ce que vous venez de voir, c'est la forme recherchée : chaque WHEN embarque sa propre condition booléenne. Il existe une forme plus courte quand vous comparez une seule expression à plusieurs constantes — la forme simple :

L'expression placée après CASE est évaluée une seule fois, puis comparée avec = à chaque valeur des WHEN. C'est plus lisible quand on fait des comparaisons d'égalité sur une seule colonne.

Petit piège à connaître : la forme simple de CASE utilise =, or en SQL, NULL = NULL n'est pas vrai. Si status peut valoir NULL, les branches 'A'/'B'/'C' ne correspondront jamais — on tombera systématiquement dans le ELSE. Pour gérer le NULL explicitement, il faut basculer sur la forme « searched » avec WHEN status IS NULL THEN ....

SQLite CASE dans ORDER BY

ORDER BY accepte n'importe quelle expression, donc CASE y fonctionne sans souci. C'est pratique quand on veut un ordre de tri personnalisé qui ne suit ni l'ordre alphabétique ni l'ordre numérique :

'high' < 'low' < 'medium' dans l'ordre alphabétique, ce qui ne vaut rien pour du tri par priorité. En associant chaque priorité à un nombre via CASE, vous obtenez enfin l'ordre qui a du sens. Le , id à la fin sert à départager les ex æquo de façon stable.

CASE dans une clause WHERE

Vous pouvez glisser un CASE à l'intérieur d'un WHERE, mais la plupart du temps ça ne sert à rien — un enchaînement de AND/OR reste bien plus lisible. Là où CASE devient vraiment utile, c'est quand la condition elle-même dépend d'une autre valeur :

Les articles en solde passent sous 20, les articles classiques sous 30. Le seuil lui-même dépend d'une condition. Sans CASE, il faudrait écrire (on_sale = 1 AND price < 20) OR (on_sale = 0 AND price < 30) — même résultat, mais beaucoup plus verbeux.

CASE à l'intérieur des fonctions d'agrégation

C'est là que CASE prend toute sa valeur. Couplé à SUM ou COUNT, il permet de calculer des totaux sur un sous-ensemble de lignes en un seul passage — l'équivalent SQL de « compte-moi celles qui correspondent » :

Le CASE renvoie 1 pour les lignes qui correspondent et 0 pour les autres : SUM se transforme alors en comptage conditionnel. La même astuce marche pour le chiffre d'affaires — on renvoie total sur les lignes qui matchent et 0 partout ailleurs. Un seul parcours de la table, plusieurs agrégats conditionnels d'un coup.

IIF : le raccourci à deux branches

Quand on n'a qu'une condition avec deux issues possibles, SQLite propose IIF(cond, when_true, when_false). C'est juste un raccourci pour CASE WHEN cond THEN when_true ELSE when_false END :

Utilisez IIF quand la logique est binaire et tient mieux sur une seule ligne. Passez à CASE dès que vous avez trois branches ou plus, qu'il faut gérer NULL à part, ou que vous voulez profiter de l'ordre d'évaluation successif des clauses WHEN.

Les pièges classiques à connaître

Voici quelques points qui font souvent trébucher :

  • Oublier END. CASE ouvre un bloc ; END le referme. SQLite vous remontera une erreur de parsing, mais bien après l'endroit où se trouve réellement la coquille.
  • Sans ELSE, on obtient NULL. Si aucune branche WHEN ne correspond et que vous n'avez pas mis de ELSE, le résultat vaut NULL. Parfois c'est voulu ; le plus souvent, non.
  • L'ordre des branches compte. Dans la forme cherchée, c'est le premier WHEN qui correspond qui l'emporte. Placer WHEN total < 500 avant WHEN total < 100 rend la seconde branche inatteignable.
  • Mélange de types. Chaque branche peut renvoyer un type différent, et SQLite ne dira rien — mais le code en aval, lui, risque de râler. Essayez de garder des types compatibles dans toutes les branches (tout en texte, ou tout en numérique).
  • CASE simple et NULL. Comme évoqué : la forme simple utilise =, qui ne matche jamais NULL. Dès que des valeurs nulles entrent en jeu, utilisez la forme cherchée.

La suite : les fonctions de chaînes

CASE permet de brancher selon une valeur ; le chapitre suivant attaque la transformation des valeurs. Les fonctions de chaînes — UPPER, LOWER, SUBSTR, REPLACE, motifs LIKE — couvrent le quotidien : nettoyer et reformater les colonnes texte. C'est ce qui nous attend.

Questions fréquentes

À quoi sert l'expression CASE en SQLite ?

CASE est l'équivalent SQL d'un if/else : on évalue des conditions et on renvoie une valeur. Attention, c'est une expression, pas une instruction — autrement dit, elle s'utilise partout où une valeur est attendue : dans un SELECT, un WHERE, un ORDER BY, un UPDATE, et même à l'intérieur d'une fonction d'agrégation. Chaque branche suit la forme WHEN condition THEN valeur, avec un ELSE final facultatif.

Quelle différence entre CASE simple et CASE searched en SQLite ?

Le CASE simple compare une seule expression à plusieurs valeurs : CASE statut WHEN 'A' THEN ... WHEN 'B' THEN ... END. Le CASE searched (avec recherche) évalue une condition booléenne distincte par branche : CASE WHEN prix > 100 THEN ... WHEN qte = 0 THEN ... END. La forme searched est nettement plus souple : on mélange librement colonnes, opérateurs et tests NULL.

Quand utiliser IIF plutôt que CASE en SQLite ?

IIF(cond, a, b) n'est qu'un raccourci pour CASE WHEN cond THEN a ELSE b END. On choisit IIF pour une logique à deux branches, quand ça se lit mieux. On revient à CASE dès qu'on a trois branches ou plus, qu'on veut maîtriser l'ordre d'évaluation, ou qu'il faut traiter explicitement les NULL avec WHEN col IS NULL.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER