É porque o parâmetro 3 da sua instrução de decodificação é NULL; conforme a documentação (grifo meu).
O Oracle converte automaticamente expr e cada valor de pesquisa para o tipo de dados do primeiro valor de pesquisa antes de comparar .... Se o primeiro resultado tiver o tipo de dados CHAR ou se o primeiro resultado for nulo, o Oracle converterá o valor de retorno para o tipo de dados VARCHAR2 .
No seu caso o primeiro resultado é NULL, que o Oracle trata como um VARCHAR2. Seu valor de retorno está sendo convertido implicitamente em um VARCHAR2. Se você alterou seu
DECODE()
para o seguinte, você obteria um número:select decode(1, 0, 0, 0.75)
e você pode obter seu NULL usando o
NULLIF()
função:select nullif(decode(1, 0, 0, 0.75), 0) ...
É melhor usar uma instrução CASE, que impõe que todos os tipos de dados retornados sejam os mesmos:
select case 1 when 0 then null
else 0.75
end ...
1. no qual também fui pego.