GREATEST |
Meilleure |
|---|---|
| Oracle Database SQL | Oracle 8.0 ou supérieure |
Syntaxe
| greatest(expression1,...,expressionN) |
Paramètres
| Nom | Description |
|---|---|
| expression1,...,expressionN | Ce paramètre permet d'indiquer une liste d'expression ou un tableau représentant des nombres à vérifier |
Description
Cette fonction permet de retourner le plus grand entier d'une expression ou d'une liste.
Remarques
- Comparaison multi-expressions : La fonction GREATEST permet de comparer plusieurs expressions en une seule instruction SQL. Elle retourne la plus grande valeur trouvée parmi les arguments passés. Cette capacité est précieuse lorsqu'on souhaite extraire une valeur maximale d'un ensemble de colonnes ou de constantes dans une même ligne de résultat. Il suffit d'indiquer plusieurs expressions numériques, textuelles ou temporelles. Son comportement simplifie donc certaines logiques de comparaison conditionnelle répétitive.
- Gestion des types de données : GREATEST fonctionne avec divers types de données : numériques (NUMBER), dates (DATE, TIMESTAMP) ou chaînes de caractères (VARCHAR2, CHAR). Toutefois, il est important que tous les paramètres soient du même type, sinon Oracle déclenche une erreur de conversion implicite. Par exemple, comparer un NUMBER avec une DATE sans conversion explicite peut poser problème. Cela impose de s'assurer d'une uniformité de typage avant son utilisation.
- Traitement des valeurs NULL : Lorsqu'au moins un des paramètres est NULL, la fonction GREATEST retourne NULL, à moins que ce soit possible d'évaluer une valeur sans tenir compte du NULL. En réalité, la présence de n'importe quel NULL dans les arguments rend le résultat NULL, ce qui peut surprendre. Pour éviter cela, il est recommandé d'utiliser NVL() ou COALESCE() en combinaison avec GREATEST pour forcer une valeur par défaut.
- Utilisation avec des dates : Lorsqu'utilisée avec des valeurs de type DATE ou TIMESTAMP, GREATEST permet de connaître la date la plus récente entre plusieurs champs. Cette capacité est utile dans les systèmes où plusieurs événements temporels sont enregistrés et où l'on veut retrouver le plus récent. Cela évite des structures complexes comme plusieurs CASE ou des sous-requêtes. Il faut cependant faire attention aux fuseaux horaires si les dates sont de type TIMESTAMP WITH TIME ZONE.
- Fonction utile dans les clauses SELECT : GREATEST peut être utilisé directement dans une clause SELECT pour créer des colonnes calculées. Elle est souvent utilisée pour extraire des indicateurs maximum ou déterminer la valeur la plus élevée sur plusieurs dimensions. Cela permet de générer des résultats dynamiques sans recours à des sous-requêtes ou des agrégats. C'est une manière concise d'effectuer des comparaisons entre colonnes.
- Incompatibilité avec les agrégats : Contrairement à une fonction comme MAX() qui est une fonction d'agrégation, GREATEST est scalaire. Elle agit ligne par ligne et ne doit pas être utilisée pour agréger sur un ensemble de lignes. Cette confusion est courante pour les débutants, car les deux fonctions retournent une valeur maximale, mais dans des contextes différents. GREATEST s'applique à plusieurs valeurs dans la même ligne, pas à plusieurs lignes.
- Optimisation de la lisibilité : En remplaçant des instructions CASE imbriquées par un simple GREATEST, le code SQL devient plus lisible. Cela est particulièrement appréciable lorsque l'on traite plusieurs champs de comparaison. Plutôt que d'utiliser une série de conditions pour déterminer la plus grande valeur, la fonction réduit le code à une seule ligne claire. Cela facilite la maintenance et réduit les risques d'erreur.
- GREATEST vs MAX : GREATEST est souvent confondue avec MAX, mais elles diffèrent fondamentalement. GREATEST compare plusieurs expressions dans une seule ligne, tandis que MAX traite une seule expression sur plusieurs lignes. Ainsi, GREATEST(col1, col2, col3) compare des colonnes d'une même ligne, alors que MAX(col1) sur un groupe renvoie la valeur maximale de cette colonne dans tout le groupe. Comprendre cette distinction est essentiel pour éviter les erreurs logiques dans les requêtes.
- Utilisation avec des expressions calculées : Il est possible d'utiliser GREATEST avec des calculs, pas seulement des colonnes. Par exemple, GREATEST(salaire * 1.1, bonus + 1000, 5000) retournera la plus grande des trois expressions. Cela permet d'évaluer dynamiquement plusieurs scénarios dans une requête SQL, sans avoir besoin de stocker chaque résultat dans une variable intermédiaire. L'utilisation avec des expressions offre une très grande flexibilité analytique.
- Compatibilité avec les chaînes : Lorsque utilisée avec des chaînes de caractères (VARCHAR2), GREATEST effectue une comparaison lexicographique (ordre alphabétique selon l'ordre de tri du jeu de caractères). Cela signifie que 'Zèbre' > 'Banane' car 'Z' est après 'B'. Ce comportement peut surprendre dans des contextes où l'on attend une comparaison par longueur ou par signification. Il faut alors appliquer des fonctions comme LENGTH() ou TO_NUMBER() selon le besoin.
- Exécution dans des vues ou des sous-requêtes : GREATEST peut être utilisée dans des vues matérialisées, des sous-requêtes ou même dans des clauses ORDER BY. Cela permet de classer ou filtrer des données sur la base de la valeur la plus élevée entre plusieurs colonnes. Par exemple, trier les lignes selon la valeur maximale entre plusieurs indicateurs devient trivial avec cette fonction. Elle est donc très polyvalente pour les requêtes avancées.
- Alternative à CASE dans les migrations : Lors de migrations d'applications vers Oracle depuis d'autres SGBD, GREATEST est souvent utilisée pour remplacer des logiques conditionnelles complexes codées avec IF...ELSE ou CASE. Elle offre une solution compacte pour exprimer des comparaisons multiples sans verbosité. Cela facilite la réécriture de code d'applications métiers en langage SQL Oracle tout en améliorant la performance et la lisibilité.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :
- SELECT 'GREATEST(5,-18)=' As Text, Greatest(5,-18) As Result FROM DUAL UNION
- SELECT 'GREATEST(0.25,0.115)=' As Text, Greatest(0.25,0.115) As Result FROM DUAL UNION
- SELECT 'GREATEST(1,2,3,4,5)=' As Text, Greatest(1,2,3,4,5) As Result FROM DUAL UNION
- SELECT 'GREATEST(5,4,3,2,1)=' As Text, Greatest(5,4,3,2,1) As Result FROM DUAL UNION
- SELECT 'GREATEST(24,34,13,72,100,1,34)=' As Text, Greatest(24,34,13,72,100,1,34) As Result FROM DUAL
on obtiendra le résultat suivant :
| TEXT | RESULT |
| GREATEST(0.25,0.115)= | ,25 |
| GREATEST(1,2,3,4,5)= | 5 |
| GREATEST(24,34,13,72,100,1,34)= | 100 |
| GREATEST(5,-18)= | 5 |
| GREATEST(5,4,3,2,1)= | 5 |
Voir également
Langage de programmation - Oracle - Référence de fonctions- «LEAST»
Article - Les géants de l'informatique - Oracle
Dernière mise à jour : Lundi, le 11 mai 2015