Dzieje się tak, ponieważ 3 parametr instrukcji decode to NULL; zgodnie z dokumentacją (moje podkreślenie).
Oracle automatycznie konwertuje wyrażenie i każdą wartość wyszukiwania na typ danych pierwszej wartości wyszukiwania przed porównaniem .... Jeśli pierwszy wynik ma typ danych CHAR lub jeśli pierwszy wynik jest pusty, Oracle konwertuje wartość zwracaną na typ danych VARCHAR2 .
W twoim przypadku pierwszym wynikiem jest NULL, który Oracle traktuje jako VARCHAR2. Twoja wartość zwracana jest niejawnie konwertowana na VARCHAR2. Jeśli zmieniłeś DECODE()
do następujących otrzymasz numer:
select decode(1, 0, 0, 0.75)
i możesz osiągnąć NULL, używając NULLIF()
funkcja:
select nullif(decode(1, 0, 0, 0.75), 0) ...
Lepiej jest użyć instrukcji CASE, która wymusza, by wszystkie zwracane typy danych były takie same:
select case 1 when 0 then null
else 0.75
end ...
1. na co też mnie przyłapano.