Question 1Laquelle des propositions suivantes est une structure d'expression CASE correcte ?
Fonctions ⑤ — CASE pour un branchement multi-conditions
Le 5e article sur les fonctions SQL. Les deux formes de CASE (forme simple et forme avec recherche), trois branches ou plus, la combinaison avec des fonctions et des conditions composées, et l'association avec ORDER BY — sur des données staff au format CSV.
Données utilisées dans cet article — la table staff
Le IIF couvert dans l'article précédent n'avait qu'une condition, donc il ne pouvait faire qu'un branchement à deux issues vrai/faux. L'expression CASE de cet article évalue trois conditions ou plus dans l'ordre et peut renvoyer une valeur différente pour chacune. C'est la syntaxe de base pour écrire un « if-elseif-else » dans SQL, et c'est la construction de branchement la plus courante dans le travail réel — catégorisation de rapports, regroupement par région, classement par grade, etc.
Le sujet est la même table staff (10 lignes) que précédemment. À travers des exercices qui construisent une classification par région sur la colonne city, une classification par tranche de paie sur salary, et une classification générationnelle sur birthday, tu essaieras les deux formes de CASE et leur application aux conditions composées dans l'ordre.
CASE a deux manières de s'écrire
L'expression CASE a deux formes — la forme simple et la forme avec recherche — et les deux peuvent produire le même résultat. Deux règles sont communes aux deux.
- Le `END` final est obligatoire — l'oublier est une erreur de syntaxe.
- `ELSE` est facultatif — s'il est omis, les lignes ne correspondant à aucun
WHENdeviennent NULL. Pour éviter NULL, indique un défaut explicitement avecELSE.
Forme ① Forme simple — Comparaison d'égalité sur une colonne
La forme simple s'écrit CASE colonne WHEN valeur1 THEN résultat1 WHEN valeur2 THEN résultat2 ... ELSE défaut END. Juste après CASE tu places une colonne à comparer, et à droite de WHEN tu écris une valeur à tester en égalité contre la colonne. Le test est l'égalité (`=`) uniquement, et tu peux écrire une seule valeur à droite de WHEN — plusieurs valeurs comme WHEN ('Tokyo', 'Osaka') ne sont pas autorisées. Elle convient à une simple substitution colonne = valeur et est plus courte à écrire.
CASE city regarde une colonne et fait une comparaison d'égalité avec chaque valeur WHEN. La valeur THEN du WHEN qui correspond est renvoyée ; si aucun ne correspond, la valeur ELSE est utilisée.-- Forme simple — remplacer city par un nom de région
SELECT name, city,
CASE city
WHEN 'Tokyo' THEN 'Kanto'
WHEN 'Yokohama' THEN 'Kanto'
WHEN 'Osaka' THEN 'Kansai'
WHEN 'Kyoto' THEN 'Kansai'
ELSE 'Other'
END AS region
FROM staff;
Forme ② Forme avec recherche — Écrire n'importe quelle condition librement
La forme avec recherche s'écrit CASE WHEN expr1 THEN résultat1 WHEN expr2 THEN résultat2 ... ELSE défaut END. Juste après CASE tu n'écris rien, et à droite de chaque WHEN tu mets la condition elle-même. Des opérateurs de comparaison comme salary >= 6000000, des LIKE tels que name LIKE '%Tanaka', IN, et des conditions composées AND / OR — tout ce que tu peux écrire dans WHERE fonctionne ici. WHEN est évalué de haut en bas, et la valeur est décidée par la première branche qui devient TRUE. Parce qu'elle est si expressive, c'est la forme principalement utilisée en pratique.
WHEN est évalué de haut en bas. Dès qu'une condition est TRUE la valeur THEN est fixée et aucune autre vérification n'a lieu. Sur FALSE on passe au WHEN suivant ; si tous sont FALSE, la valeur ELSE est utilisée.-- Forme avec recherche — répartir salary en 2 tranches
SELECT name, salary,
CASE
WHEN salary >= 5000000 THEN 'High'
ELSE 'Standard'
END AS pay_band
FROM staff;
Combiner avec des fonctions et des conditions composées pour un branchement plus complexe
Une clause CASE WHEN peut contenir des expressions combinant opérateurs de comparaison, LIKE, IN, AND / OR, et appels de fonctions. Tu peux extraire l'année de naissance avec strftime('%Y', birthday) vu dans Fonctions ① fonctions de date pour une classification générationnelle ; puisque name est dans l'ordre « prénom nom », name LIKE '%Tanaka' (correspondance suffixe) classe les personnes dont le nom de famille est Tanaka ; et tu peux écrire des conditions combinant plusieurs colonnes avec AND.
L'exemple ci-dessous extrait l'année de naissance par tranches de 10 ans et libelle les personnes nées dans les années 1990 en 'Gen Z' et celles des années 1980 en 'Gen X-Y'. Comme strftime renvoie une chaîne, les comparaisons se font contre des littéraux de chaîne ('1990' / '1999').
-- 1) Libeller l'année de naissance par tranches de 5 ans
SELECT name, birthday,
CASE
WHEN strftime('%Y', birthday) BETWEEN '1985' AND '1989' THEN 'Late 1980s'
WHEN strftime('%Y', birthday) BETWEEN '1990' AND '1994' THEN 'Early 1990s'
ELSE 'Other'
END AS cohort
FROM staff;
-- 2) Condition composée : salaire élevé AND basé à Tokyo
SELECT name, city, salary,
CASE
WHEN salary >= 6000000 AND city = 'Tokyo' THEN 'Tokyo senior'
WHEN salary >= 6000000 THEN 'Senior'
ELSE 'Other'
END AS tag
FROM staff;
Vérification des connaissances
Répondez à chaque question une par une.
Question 2Quelle est une description correcte de la forme simple CASE city WHEN 'Tokyo' THEN 'TOK' WHEN 'Osaka' THEN 'OSA' ELSE city END ?
Question 3Que renvoie CASE WHEN salary >= 6000000 THEN 'Senior' WHEN salary >= 4500000 THEN 'Mid' ELSE 'Junior' END pour une ligne avec salary = 7 000 000 ?