COALESCE et CASE WHEN¶
Fonction COALESCE¶
Qu’est-ce que COALESCE ?¶
COALESCE renvoie la première valeur non nulle d’une liste d’expressions. Elle est idéale pour gérer les valeurs nulles
et fournir des valeurs par défaut ou des solutions de repli.
Syntaxe¶
Exemples de base¶
Gestion simple des valeurs nulles¶
-- Au lieu d'afficher NULL, afficher un message par défaut
SELECT name,
COALESCE(phone, 'Aucun téléphone fourni') AS contact_phone
FROM Customer;
Plusieurs solutions de repli¶
-- Essayer plusieurs méthodes de contact selon un ordre de préférence
SELECT name,
COALESCE(email, phone, 'Aucune information de contact') AS primary_contact
FROM Customer;
Valeurs numériques par défaut¶
-- Gérer les tarifs nuls avec une valeur par défaut
SELECT license_plate,
make,
model,
COALESCE(daily_rate, 0.00) AS display_rate
FROM Car;
Instructions CASE WHEN¶
Qu’est-ce que CASE WHEN ?¶
CASE WHEN permet d’implémenter une logique conditionnelle en SQL, similaire aux instructions if-else dans les langages
de programmation.
Deux formes de CASE¶
1. CASE simple (comparaison d’une seule expression)¶
CASE expression
WHEN valeur1 THEN résultat1
WHEN valeur2 THEN résultat2
ELSE résultat_par_défaut
END
2. CASE recherché (conditions multiples)¶
Exemples avec CASE WHEN¶
Catégorisation des données¶
-- Catégoriser les voitures par âge
SELECT license_plate,
make,
model,
year,
CASE
WHEN year >= 2020 THEN 'Neuve'
WHEN year >= 2015 THEN 'Récente'
WHEN year >= 2010 THEN 'Ancienne'
ELSE 'Vintage'
END AS age_category
FROM Car;
Traduction des statuts¶
-- Rendre le statut des rapports de dommage plus convivial
SELECT report_id,
damage_description,
CASE status
WHEN 'P' THEN 'En attente de validation'
WHEN 'I' THEN 'En cours'
WHEN 'C' THEN 'Terminé'
WHEN 'X' THEN 'Annulé'
ELSE 'Statut inconnu'
END AS status_description
FROM DamageReport;
Calculs conditionnels¶
-- Appliquer des tarifs différents selon la durée de location
SELECT rental_id,
start_date,
end_date,
end_date - start_date AS rental_days,
daily_rate,
CASE
WHEN end_date - start_date >= 7 THEN daily_rate * 0.85 -- Réduction hebdomadaire de 15 %
WHEN end_date - start_date >= 3 THEN daily_rate * 0.95 -- Réduction de 5 % pour 3 jours ou plus
ELSE daily_rate
END AS effective_daily_rate
FROM Rental r
JOIN Car c ON r.car_license_plate = c.license_plate;
Combinaison de COALESCE et CASE WHEN¶
Exemples avancés¶
Affichage intelligent des contacts¶
-- Créer un champ de contact intelligent avec formatage
SELECT name,
CASE
WHEN email IS NOT NULL AND phone IS NOT NULL
THEN CONCAT(email, ' (', phone, ')')
WHEN email IS NOT NULL
THEN email
WHEN phone IS NOT NULL
THEN phone
ELSE 'Aucune information de contact'
END AS formatted_contact
FROM Customer;
Liste de voitures améliorée¶
-- Créer des descriptions de voitures conviviales
SELECT license_plate,
CONCAT(
COALESCE(year, 'Année inconnue'), ' ',
COALESCE(make, 'Marque inconnue'), ' ',
COALESCE(model, 'Modèle inconnu')
) AS car_description,
COALESCE(color, 'Couleur non spécifiée') AS color_display,
CASE
WHEN daily_rate IS NULL THEN 'Prix sur demande'
WHEN daily_rate = 0 THEN 'Location gratuite'
WHEN daily_rate < 50 THEN CONCAT('$', daily_rate, '/jour (Économique)')
WHEN daily_rate < 100 THEN CONCAT('$', daily_rate, '/jour (Standard)')
ELSE CONCAT('$', daily_rate, '/jour (Premium)')
END AS pricing_display
FROM Car;
Tableau de bord des locations¶
-- Créer une vue complète du statut des locations
SELECT r.rental_id,
c.name AS customer_name,
CONCAT(car.year, ' ', car.make, ' ', car.model) AS vehicle,
r.start_date,
r.end_date,
CASE
WHEN r.start_date > now() THEN 'À venir'
WHEN r.end_date < now() THEN 'Terminée'
ELSE 'Active'
END AS rental_status,
COALESCE(
CASE
WHEN p.payment_id IS NOT NULL THEN 'Payée'
WHEN r.end_date < now() THEN 'Paiement en retard'
ELSE 'Paiement en attente'
END,
'Statut de paiement inconnu'
) AS payment_status
FROM Rental r
JOIN Customer c ON r.customer_id = c.customer_id
JOIN Car car ON r.car_license_plate = car.license_plate
LEFT JOIN Payment p ON r.rental_id = p.rental_id;
Conseils pratiques¶
1. Gestion élégante des valeurs NULL¶
-- Au lieu d'afficher des valeurs NULL aux utilisateurs
SELECT name,
COALESCE(driver_license, 'Vérification du permis en attente') AS license_status,
COALESCE(email, 'Email non fourni') AS email_display
FROM Customer;
2. Création de rapports conviviaux¶
-- Analyse des coûts de maintenance avec catégories lisibles
SELECT car_license_plate,
service_type,
cost,
CASE
WHEN cost IS NULL THEN 'Coût non enregistré'
WHEN cost = 0 THEN 'Sans frais'
WHEN cost < 100 THEN 'Entretien mineur'
WHEN cost < 500 THEN 'Maintenance standard'
ELSE 'Réparation majeure'
END AS cost_category,
COALESCE(description, 'Aucun détail supplémentaire') AS service_notes
FROM MaintenanceRecord;
3. Validation et nettoyage des données¶
-- Nettoyer et standardiser les descriptions des transactions de fidélité
SELECT transaction_id,
customer_id,
points_amount,
CASE transaction_type
WHEN 'E' THEN 'Gagnés'
WHEN 'R' THEN 'Échangés'
WHEN 'A' THEN 'Ajustés'
WHEN 'B' THEN 'Bonus'
ELSE COALESCE(transaction_type, 'Inconnu')
END AS transaction_type_display,
COALESCE(
NULLIF(TRIM(description), ''), -- Convertir d'abord les chaînes vides en NULL
'Transaction standard'
) AS description_clean
FROM LoyaltyTransaction;
Modèles courants¶
Modèle 1 : Concaténation sécurisée contre les NULL¶
-- Combiner en toute sécurité des champs pouvant être nuls
SELECT COALESCE(
CASE
WHEN name IS NOT NULL AND email IS NOT NULL
THEN CONCAT(name, ' <', email, '>')
ELSE name
END,
'Client anonyme'
) AS display_name
FROM Customer;
Modèle 2 : Agrégation conditionnelle¶
-- Calculer différents totaux selon des conditions
SELECT location_id,
COUNT(*) AS total_cars,
SUM(CASE WHEN daily_rate < 50 THEN 1 ELSE 0 END) AS budget_cars,
SUM(CASE WHEN daily_rate >= 100 THEN 1 ELSE 0 END) AS premium_cars,
AVG(COALESCE(daily_rate, 0)) AS average_rate
FROM Car
GROUP BY location_id;
Modèle 3 : Tri dynamique¶
-- Créer des valeurs d'affichage triables
SELECT *,
CASE
WHEN status = 'Active' THEN 1
WHEN status = 'Pending' THEN 2
WHEN status = 'Completed' THEN 3
ELSE 4
END AS sort_priority
FROM (SELECT rental_id,
customer_id,
CASE
WHEN start_date > now() THEN 'Pending'
WHEN end_date >= now() THEN 'Active'
ELSE 'Completed'
END AS status
FROM Rental) AS rental_with_status
ORDER BY sort_priority, start_date;
Notes sur les performances¶
COALESCEcesse d’évaluer les expressions dès qu’elle trouve une valeur non nulleCASE WHENcesse d’évaluer les conditions dès qu’une correspondance est trouvée- Les deux fonctions peuvent être utilisées dans les clauses WHERE, ORDER BY et les agrégations
- Pensez à indexer les colonnes utilisées dans les conditions CASE pour de meilleures performances
Résumé¶
- COALESCE : Idéal pour fournir des valeurs par défaut et gérer les valeurs nulles
- CASE WHEN : Essentiel pour la logique conditionnelle et la transformation des données
- Combinaison : Permet de créer des présentations de données sophistiquées et conviviales
- Bonne pratique : Pensez toujours à la manière dont vos résultats seront perçus par les utilisateurs finaux, et gérez les cas limites avec élégance
Utilisation de l’IA
Page rédigée en partie avec l’aide d’un assistant IA, principalement à l’aide de Perplexity AI. L’IA a été utilisée pour générer des explications, des exemples et/ou des suggestions de structure. Toutes les informations ont été vérifiées, éditées et complétées par l’auteur.