234 votes

Différences Oracle entre NVL et Coalesce

Y a-t-il des différences non évidentes entre NVL et Coalesce dans Oracle ?

Les différences évidentes sont que coalesce renvoie le premier élément non nul de 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 renvoie le second.

Il semble que le NVL ne soit qu'une version "de base" de coalesce.

Est-ce que j'ai raté quelque chose ?

341voto

Quassnoi Points 191041

COALESCE est une fonction plus moderne qui fait partie de ANSI-92 standard.

NVL es Oracle spécifique, il a été introduit en 80 avant qu'il n'y ait des normes.

Dans le cas de deux valeurs, elles sont synonymes.

Cependant, ils sont mis en œuvre différemment.

NVL évalue toujours les deux arguments, tandis que COALESCE arrête l'évaluation dès qu'il trouve le premier non NULL :

SELECT  SUM(val)
FROM    (
        SELECT  NVL(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
        FROM    dual
        CONNECT BY
                level <= 10000
        )

Cela fonctionne pendant presque 0.5 secondes, puisqu'il génère SYS_GUID() malgré 1 n'étant pas un NULL .

SELECT  SUM(val)
FROM    (
        SELECT  COALESCE(1, LENGTH(RAWTOHEX(SYS_GUID()))) AS val
        FROM    dual
        CONNECT BY
                level <= 10000
        )

Ceci comprend que 1 n'est pas un NULL et n'évalue pas le second argument.

SYS_GUID ne sont pas générés et la requête est instantanée.

185voto

Gary Myers Points 24819

NVL effectuera une conversion implicite vers le type de données du premier paramètre, de sorte que l'erreur suivante ne se produira pas

select nvl('a',sysdate) from dual;

COALESCE attend des types de données cohérents.

select coalesce('a',sysdate) from dual;

produira une "erreur de type de données inconsistant".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X