CASE WHEN ... THEN ... END en SQLL'opérateur CASE en SQL permet d'ajouter une logique conditionnelle directement dans une requête. Il sert à créer des catégories, afficher des libellés lisibles, filtrer des données selon des règles différentes et définir un tri personnalisé. C'est un outil essentiel quand vous voulez rendre une requête plus intelligente sans déplacer la logique dans le code applicatif.
Dans cette leçon, nous allons voir :
CASE ;SELECT ;WHERE ;CASE dans ORDER BY.CASECASE existe sous deux formes principales.
simple CASE)CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
Cette forme compare une seule expression (expression) à plusieurs valeurs.
searched CASE)CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
Ici, chaque WHEN contient une condition complète. Cette forme est plus souple et la plus utilisée.
Points importants :
WHEN qui correspond est utilisée ;ELSE est appliqué ;ELSE est absent, le résultat est NULL.CASE dans SELECTLe cas d'usage le plus fréquent est d'ajouter une colonne calculée avec une catégorie ou un statut.
SELECT
payment_id,
amount,
CASE
WHEN amount < 2 THEN 'Paiement faible'
WHEN amount BETWEEN 2 AND 6 THEN 'Paiement moyen'
ELSE 'Paiement élevé'
END AS payment_level
FROM payment
LIMIT 10;
Ce que fait la requête :
amount pour chaque ligne de payment ;payment_level.SELECT
rental_id,
rental_date,
return_date,
CASE
WHEN return_date IS NULL THEN 'Non retourné'
ELSE 'Retourné'
END AS rental_status
FROM rental
LIMIT 10;
Cette approche est pratique pour les rapports et tableaux de bord, où des valeurs brutes doivent être converties en statuts clairs.
CASE dans WHEREMême si CASE est surtout utilisé dans SELECT, il peut aussi servir à filtrer. C'est utile lorsque la règle de filtrage dépend d'une autre colonne ou de seuils différents selon le contexte.
SELECT
payment_id,
staff_id,
amount
FROM payment
WHERE amount >= CASE
WHEN staff_id = 1 THEN 5
WHEN staff_id = 2 THEN 3
ELSE 4
END;
Logique du filtre :
staff_id = 1, on garde les paiements avec amount >= 5 ;staff_id = 2, on garde les paiements avec amount >= 3 ;amount >= 4.Pour des conditions très simples, une expression avec OR est parfois plus lisible. Mais CASE dans WHERE reste pertinent quand la logique métier est réellement ramifiée et doit rester dans une seule expression.
CASE dans ORDER BYUn besoin fréquent consiste à trier selon une priorité métier, plutôt que selon l'ordre alphabétique ou numérique. CASE est parfait pour cela.
SELECT
title,
rating
FROM film
ORDER BY CASE rating
WHEN 'G' THEN 1
WHEN 'PG' THEN 2
WHEN 'PG-13' THEN 3
WHEN 'R' THEN 4
WHEN 'NC-17' THEN 5
ELSE 6
END,
title;
Résultat : les films aux classifications les plus « douces » apparaissent d'abord, puis les plus strictes, indépendamment du tri texte standard.
SELECT
rental_id,
rental_date,
return_date
FROM rental
ORDER BY CASE
WHEN return_date IS NULL THEN 0
ELSE 1
END,
rental_date DESC
LIMIT 20;
Ainsi, les enregistrements les plus importants remontent en tête de résultat.
Segmenter les clients selon leurs dépenses :
SELECT
customer_id,
SUM(amount) AS total_spent,
CASE
WHEN SUM(amount) < 50 THEN 'Basique'
WHEN SUM(amount) < 100 THEN 'Actif'
ELSE 'VIP'
END AS customer_segment
FROM payment
GROUP BY customer_id;
Compter les enregistrements par groupes conditionnels :
SELECT
SUM(CASE WHEN amount < 2 THEN 1 ELSE 0 END) AS low_count,
SUM(CASE WHEN amount BETWEEN 2 AND 6 THEN 1 ELSE 0 END) AS medium_count,
SUM(CASE WHEN amount > 6 THEN 1 ELSE 0 END) AS high_count
FROM payment;
Définir une priorité personnalisée pour un rapport :
SELECT
title,
replacement_cost
FROM film
ORDER BY CASE
WHEN replacement_cost >= 25 THEN 1
WHEN replacement_cost >= 20 THEN 2
ELSE 3
END,
replacement_cost DESC;
CASE WHEN ... THEN ... END est un outil universel de logique conditionnelle en SQL.
Idées essentielles :
SELECT, il permet de créer des catégories et des statuts ;WHERE, il gère une logique de filtre ramifiée ;ORDER BY, il donne un contrôle total sur un ordre personnalisé ;ELSE pour éviter des NULL inattendus.En maîtrisant CASE, vos requêtes SQL deviennent plus flexibles, plus lisibles et plus proches de la logique métier.