En Oracle, el NANVL()
La función nos permite tratar con NaN
valores especificando otro número para devolver en su lugar.
La forma en que funciona es que acepta dos argumentos. Si el primer argumento es NaN
(no un número), devuelve el segundo argumento. Si el primer argumento es un número, simplemente devuelve ese número.
Tenga en cuenta que esta función solo es útil para números de coma flotante de tipo BINARY_FLOAT
o BINARY_DOUBLE
.
Sintaxis
La sintaxis es así:
NANVL(n2, n1)
Cada argumento puede ser cualquier tipo de dato numérico o cualquier tipo de dato no numérico que se pueda convertir implícitamente a un tipo de dato numérico.
Ejemplo
Podemos producir NaN
dividiendo un valor flotante/doble cero por cero:
SELECT 0f/0
FROM DUAL;
Resultado:
0F/0 _______ NaN
Pero si no queremos NaN
para ser devuelto, podemos usar el NANVL()
función para devolver un valor diferente:
SELECT NANVL(0f/0, 0)
FROM DUAL;
Resultado:
NANVL(0F/0,0) ________________ 0.0
Aquí está de nuevo, pero esta vez especificamos un valor diferente para devolver en lugar de NaN
:
SELECT NANVL(0f/0, 123)
FROM DUAL;
Resultado:
NANVL(0F/0,123) __________________ 123.0
NaN
Literal de coma flotante
Oracle también proporciona algunos literales de coma flotante para situaciones que no se pueden expresar como un literal numérico. Estos incluyen binary_float_nan
que representa un valor de tipo BINARY_FLOAT
para el cual la condición IS
NAN
es verdadero, y binary_double_nan
, que representa un valor de tipo BINARY_DOUBLE
para el cual la condición IS
NAN
es verdad.
Aquí hay un ejemplo del uso de estos literales de punto flotante en su lugar:
SELECT
NANVL(binary_double_nan, 0),
NANVL(binary_float_nan, 0)
FROM DUAL;
Resultado:
NANVL(BINARY_DOUBLE_NAN,0) NANVL(BINARY_FLOAT_NAN,0) _____________________________ ____________________________ 0.0 0.0
Pasar un número
Como se mencionó, si el primer argumento es un número, devuelve ese número:
SELECT NANVL(33, 0)
FROM DUAL;
Resultado:
NANVL(33,0) ______________ 33
Argumentos no numéricos
Los argumentos pueden ser cualquier tipo de dato numérico o cualquier tipo de dato no numérico que se pueda convertir implícitamente a un tipo de dato numérico.
Aquí hay un ejemplo de lo que sucede cuando los argumentos no satisfacen ese criterio:
SELECT NANVL('Gosh', 'Dang')
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT NANVL('Gosh', 'Dang') FROM DUAL Error report - ORA-01722: invalid number
Argumentos nulos
NANVL()
devuelve null
si algún argumento es null
:
SET NULL 'null';
SELECT
NANVL(null, 16),
NANVL(1024, null),
NANVL(null, null)
FROM DUAL;
Resultado:
NANVL(NULL,16) NANVL(1024,NULL) NANVL(NULL,NULL) _________________ ___________________ ___________________ null null null
De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que se produce un valor nulo como resultado de un SQL SELECT
declaración.
Sin embargo, puede usar SET NULL
para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null
debe ser devuelto.
Argumentos faltantes
Llamando a NANVL()
sin ningún argumento da como resultado un error:
SELECT NANVL()
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT NANVL() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00909: invalid number of arguments 00909. 00000 - "invalid number of arguments" *Cause: *Action:
Y lo mismo se aplica cuando se llama con demasiados argumentos:
SELECT NANVL(10, 2, 3)
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT NANVL(10, 2, 3) FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00909: invalid number of arguments 00909. 00000 - "invalid number of arguments" *Cause: *Action: