Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que o DECODE da Oracle está me dando um valor diferente do NVL?


É 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.