Existe-t-il des différences non évidentes entre NVL et Coalesce dans Oracle?
Les différences évidentes sont que coalesce renverra le premier élément non nul dans sa liste de paramètres alors que nvl ne prend que deux paramètres et renvoie le premier s'il n'est pas nul, sinon il retourne le second.
Il semble que NVL soit juste une version «de base» de la fusion.
Suis-je en train de manquer quelque chose?
Réponses:
COALESCE
est une fonction plus moderne qui fait partie de laANSI-92
norme.NVL
estOracle
spécifique, il a été introduit dans80
's avant qu'il n'y ait des normes.Dans le cas de deux valeurs, ce sont des synonymes.
Cependant, ils sont mis en œuvre différemment.
NVL
évalue toujours les deux arguments, maisCOALESCE
arrête généralement l'évaluation chaque fois qu'il trouve le premier nonNULL
(il y a quelques exceptions, comme la séquenceNEXTVAL
):Cela fonctionne pendant près de
0.5
secondes, car il génèreSYS_GUID()
des, bien1
qu'il ne soit pas unNULL
.Cela comprend que ce
1
n'est pas unNULL
et n'évalue pas le deuxième argument.SYS_GUID
ne sont pas générés et la requête est instantanée.la source
NVL effectuera une conversion implicite vers le type de données du premier paramètre, donc ce qui suit ne fait pas d'erreur
COALESCE attend des types de données cohérents.
générera une "erreur de type de données incohérent"
la source
NVL et COALESCE sont utilisés pour obtenir la même fonctionnalité de fourniture d'une valeur par défaut au cas où la colonne renvoie un NULL.
Les différences sont les suivantes:
Exemples pour le troisième cas. D'autres cas sont simples.
select nvl('abc',10) from dual;
fonctionnerait car NVL effectuera une conversion implicite du numérique 10 en chaîne.select coalesce('abc',10) from dual;
échouera avec Erreur - types de données incohérents: CHAR attendu a NUMBERExemple de cas d'utilisation UNION
échoue avec
ORA-00932: inconsistent datatypes: expected CHAR got DATE
réussit.
Plus d'informations: http://www.plsqlinformation.com/2016/04/difference-between-nvl-and-coalesce-in-oracle.html
la source
Il existe également une différence dans la gestion des plans.
Oracle est capable de former un plan optimisé avec concaténation de filtres de branche lorsque la recherche contient une comparaison des
nvl
résultats avec une colonne indexée.nvl:
se fondre:
Les crédits sont disponibles sur http://www.xt-r.com/2012/03/nvl-coalesce-concatenation.html .
la source
Une autre preuve que coalesce () n'arrête pas l'évaluation avec la première valeur non nulle:
Exécutez ceci, puis vérifiez
my_sequence.currval;
la source
En fait, je ne peux pas accepter chaque déclaration.
"COALESCE s'attend à ce que tous les arguments soient du même type de données."
C'est faux, voir ci-dessous. Les arguments peuvent être différents types de données, ce qui est également documenté : si toutes les occurrences de expr sont des types de données numériques ou tout type de données non numériques qui peuvent être implicitement convertis en un type de données numériques, Oracle Database détermine alors l'argument ayant la priorité numérique la plus élevée, implicitement convertit les arguments restants en ce type de données et renvoie ce type de données. . En fait, cela est même en contradiction avec l'expression courante "COALESCE s'arrête à la première occurrence d'une valeur non nulle", sinon le cas de test n ° 4 ne devrait pas générer d'erreur.
Toujours selon le cas de test n ° 5,
COALESCE
une conversion implicite des arguments est effectuée.la source
Bien que celui-ci soit évident, et même mentionné d'une manière présentée par Tom qui a posé cette question. Mais reprenons.
NVL ne peut avoir que 2 arguments. Coalesce peut en avoir plus de 2.
select nvl('','',1) from dual;
// Résultat::ORA-00909
nombre d'arguments invalideselect coalesce('','','1') from dual;
// Sortie: renvoie 1la source
NVL: remplacez le null par une valeur.
COALESCE: renvoie la première expression non nulle de la liste d'expressions.
Tableau: PRICE_LIST
Vous trouverez ci-dessous l'exemple de
[1] Fixer le prix de vente en ajoutant 10% de profit à tous les produits.
[2] S'il n'y a pas de prix d'achat, le prix de vente est le prix minimum. Pour vente en liquidation.
[3] S'il n'y a pas de prix minimum également, définissez le prix de vente comme prix par défaut "50".
Expliquez avec un exemple pratique de la vie réelle.
Vous pouvez voir qu'avec NVL, nous pouvons atteindre les règles [1], [2]
Mais avec COALSECE, nous pouvons atteindre les trois règles.
la source
NVL(Purchase_Price + (Purchase_Price * 0.10), nvl(Min_Price,50))
. Ou environ:nvl(NVL(Purchase_Price + (Purchase_Price * 0.10), Min_Price) ,50)
:)