È perché il parametro 3 della tua istruzione di decodifica è NULL; come da documentazione (corsivo mio).
Oracle converte automaticamente expr e ogni valore di ricerca nel tipo di dati del primo valore di ricerca prima del confronto .... Se il primo risultato ha il tipo di dati CHAR o se il primo risultato è null, Oracle converte il valore restituito nel tipo di dati VARCHAR2 .
Nel tuo caso il primo risultato è NULL, che Oracle tratta come VARCHAR2. Il tuo valore restituito viene convertito implicitamente in un VARCHAR2. Se hai cambiato il tuo DECODE()
al seguente otterresti un numero:
select decode(1, 0, 0, 0.75)
e potresti ottenere il tuo NULL usando il NULLIF()
funzione:
select nullif(decode(1, 0, 0, 0.75), 0) ...
È meglio utilizzare un'istruzione CASE, che impone che tutti i tipi di dati restituiti siano gli stessi:
select case 1 when 0 then null
else 0.75
end ...
1. di cui sono stato catturato anch'io.