sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor giver Oracles DECODE mig en anden værdi end NVL?

Det er fordi parameteren 3 i din decode-sætning er NULL; i henhold til dokumentationen (min fremhævelse).

Oracle konverterer automatisk expr og hver søgeværdi til datatypen for den første søgeværdi før sammenligning .... Hvis det første resultat har datatypen CHAR eller hvis det første resultat er null, så konverterer Oracle returværdien til datatypen VARCHAR2 .

I dit tilfælde er det første resultat NULL, som Oracle behandler som en VARCHAR2. Din returværdi bliver implicit konverteret til en VARCHAR2. Hvis du har ændret din DECODE() til følgende får du et nummer:

select decode(1, 0, 0, 0.75)

og du kan opnå din NULL ved at bruge NULLIF() funktion:

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

Det er bedre at bruge en CASE-sætning, som håndhæver, at alle returnerede datatyper er de samme:

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

1. som jeg også er blevet fanget af.



  1. Oracle SQL GROUP BY ikke en GROUP BY udtrykshjælp

  2. Kald til udefineret funktion oci_connect()

  3. Indsætter i Oracle Nested Table i Java

  4. Sådan konverteres en streng til små bogstaver i SQL