Je to proto, že parametr 3 vašeho příkazu dekódování je NULL; podle dokumentace (můj důraz).
Oracle před porovnáním automaticky převede výraz a každou hodnotu vyhledávání na datový typ první hodnoty vyhledávání .... Pokud má první výsledek datový typ CHAR nebo pokud je první výsledek null, pak Oracle převede návratovou hodnotu na datový typ VARCHAR2 .
Ve vašem případě je prvním výsledkem NULL, což Oracle považuje za VARCHAR2. Vaše vrácená hodnota se implicitně převádí na VARCHAR2. Pokud jste změnili DECODE()
k následujícímu byste dostali číslo:
select decode(1, 0, 0, 0.75)
a můžete dosáhnout své NULL pomocí NULLIF()
funkce:
select nullif(decode(1, 0, 0, 0.75), 0) ...
Je lepší použít příkaz CASE, který vynucuje, aby všechny vrácené datové typy byly stejné:
select case 1 when 0 then null
else 0.75
end ...
1. na který jsem se taky chytil.