sql >> Base de Datos >  >> RDS >> Oracle

¿Por qué DECODE de Oracle me da un valor diferente al de NVL?

Es porque el parámetro 3 de su declaración de decodificación es NULL; según la documentación (mi énfasis).

Oracle convierte automáticamente expr y cada valor de búsqueda al tipo de datos del primer valor de búsqueda antes de comparar .... Si el primer resultado tiene el tipo de datos CHAR o si el primer resultado es nulo, Oracle convierte el valor devuelto al tipo de datos VARCHAR2 .

En su caso, el primer resultado es NULL, que Oracle trata como VARCHAR2. Su valor de retorno se convierte implícitamente en un VARCHAR2. Si cambiaste tu DECODE() a lo siguiente obtendrías un número:

select decode(1, 0, 0, 0.75)

y podría lograr su NULL usando NULLIF() función:

select nullif(decode(1, 0, 0, 0.75), 0) ...

Es mejor usar una instrucción CASE, que obliga a que todos los tipos de datos devueltos sean iguales:

select case 1 when 0 then null
              else 0.75
       end ...

1. en lo que también me han pillado.