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

Función NANVL() en Oracle

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: