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.