Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi DECODE d'Oracle me donne-t-il une valeur différente de NVL ?

C'est parce que le paramètre 3 de votre instruction de décodage est NULL ; selon la documentation (c'est moi qui souligne).

Oracle convertit automatiquement expr et chaque valeur de recherche dans le type de données de la première valeur de recherche avant la comparaison .... Si le premier résultat a le type de données CHAR ou si le premier résultat est nul, alors Oracle convertit la valeur de retour en type de données VARCHAR2 .

Dans votre cas, le premier résultat est NULL, qu'Oracle traite comme un VARCHAR2. Votre valeur de retour est implicitement convertie en VARCHAR2. Si vous avez changé votre DECODE() à ce qui suit, vous obtiendrez un numéro :

select decode(1, 0, 0, 0.75)

et vous pouvez obtenir votre NULL en utilisant le NULLIF() fonction :

select nullif(decode(1, 0, 0, 0.75), 0) ...

Il est préférable d'utiliser une instruction CASE, qui impose que tous les types de données renvoyés soient identiques :

select case 1 when 0 then null
              else 0.75
       end ...

1. sur lequel j'ai également été pris.