
GREATEST et LEAST en Oracle renvoient respectivement la plus grande et la plus petite valeur parmi une liste d’expressions, évaluées sur une même ligne. Attention à ne pas les confondre avec MAX et MIN, qui agrègent des lignes. Voici la différence et des exemples utiles.
Syntaxe
GREATEST(valeur1, valeur2, ...) -- la plus grande
LEAST(valeur1, valeur2, ...) -- la plus petiteSELECT GREATEST(10, 25, 7) AS max_val, -- 25
LEAST(10, 25, 7) AS min_val -- 7
FROM dual;La différence cruciale avec MAX / MIN
| GREATEST / LEAST | MAX / MIN | |
|---|---|---|
| Agit sur | plusieurs colonnes d’une même ligne | plusieurs lignes d’une colonne |
| Type | fonction ligne à ligne | fonction d’agrégation |
| Exemple | plus grande de 3 dates d’une ligne | date max de la table |
-- GREATEST : la date la plus récente PARMI 3 colonnes
SELECT id, GREATEST(date_creation, date_maj, date_validation) AS derniere_action
FROM dossiers;
-- MAX : la date la plus récente DE TOUTE la table
SELECT MAX(date_creation) FROM dossiers;Exemples pratiques
Borner une valeur (clamp)
-- ne jamais descendre sous 0 ni dépasser 100
SELECT LEAST(GREATEST(score, 0), 100) AS score_borne FROM tests;Comparer des dates
SELECT GREATEST(date_livraison, date_commande + 7) AS date_engagement
FROM commandes;⚠️ Le piège des NULL
Si une seule des valeurs est NULL, GREATEST et LEAST renvoient NULL :
SELECT GREATEST(10, NULL, 5) FROM dual; -- NULL !Protégez-vous avec NVL ou COALESCE :
SELECT GREATEST(NVL(a,0), NVL(b,0), NVL(c,0)) FROM t;Le piège des types
Oracle convertit toutes les valeurs au type de la première. GREATEST(10, '25') compare en numérique (car 10 est un nombre) ; GREATEST('10', '25', '7') compare en texte → ‘7’ > ’25’ ! Veillez à l’homogénéité des types.
FAQ
GREATEST ou MAX : lequel choisir ?
GREATEST pour comparer des colonnes d’une même ligne ; MAX pour le maximum d’une colonne sur plusieurs lignes.
Pourquoi mon GREATEST renvoie NULL ?
Une des valeurs est NULL. Enveloppez chaque argument dans NVL/COALESCE pour neutraliser les NULL.
Combien d’arguments peut-on passer ?
Plusieurs, sans limite pratique : GREATEST(a, b, c, d, …).
