Oracle
 sql >> Database >  >> RDS >> Oracle

NANVL() Funzione in Oracle

In Oracle, il NANVL() la funzione ci consente di gestire NaN valori specificando un altro numero da restituire al suo posto.

Il modo in cui funziona è, accetta due argomenti. Se il primo argomento è NaN (non un numero), restituisce il secondo argomento. Se il primo argomento è un numero, quindi restituisce semplicemente quel numero.

Nota che questa funzione è utile solo per numeri a virgola mobile di tipo BINARY_FLOAT o BINARY_DOUBLE .

Sintassi

La sintassi è questa:

NANVL(n2, n1)

Ogni argomento può essere qualsiasi tipo di dati numerico o qualsiasi tipo di dati non numerico che può essere convertito in modo implicito in un tipo di dati numerico.

Esempio

Possiamo produrre NaN dividendo un valore float/doppio zero per zero:

SELECT 0f/0 
FROM DUAL;

Risultato:

   0F/0 
_______ 
NaN     

Ma se non vogliamo NaN da restituire, possiamo usare il NANVL() funzione per restituire un valore diverso:

SELECT NANVL(0f/0, 0) 
FROM DUAL;

Risultato:

   NANVL(0F/0,0) 
________________ 
0.0             

Eccolo di nuovo, ma questa volta specifichiamo un valore diverso da restituire al posto di NaN :

SELECT NANVL(0f/0, 123) 
FROM DUAL;

Risultato:

   NANVL(0F/0,123) 
__________________ 
123.0              

NaN Letterale in virgola mobile

Oracle fornisce anche alcuni valori letterali a virgola mobile per situazioni che non possono essere espresse come valore letterale numerico. Questi includono binary_float_nan che rappresenta un valore di tipo BINARY_FLOAT per cui la condizione IS NAN è vero e binary_double_nan , che rappresenta un valore di tipo BINARY_DOUBLE per cui la condizione IS NAN è vero.

Ecco un esempio di utilizzo di questi valori letterali a virgola mobile invece:

SELECT 
    NANVL(binary_double_nan, 0), 
    NANVL(binary_float_nan, 0)
FROM DUAL;

Risultato:

   NANVL(BINARY_DOUBLE_NAN,0)    NANVL(BINARY_FLOAT_NAN,0) 
_____________________________ ____________________________ 
0.0                           0.0                         

Passare un numero

Come accennato, se il primo argomento è un numero, restituisce quel numero:

SELECT NANVL(33, 0) 
FROM DUAL;

Risultato:

   NANVL(33,0) 
______________ 
            33 

Argomenti non numerici

Gli argomenti possono essere qualsiasi tipo di dati numerico o qualsiasi tipo di dati non numerico che può essere convertito in modo implicito in un tipo di dati numerico.

Ecco un esempio di cosa succede quando gli argomenti non soddisfano quel criterio:

SELECT NANVL('Gosh', 'Dang')
FROM DUAL;

Risultato:

Error starting at line : 1 in command -
SELECT NANVL('Gosh', 'Dang')
FROM DUAL
Error report -
ORA-01722: invalid number

Argomenti nulli

NANVL() restituisce null se un argomento è null :

SET NULL 'null';

SELECT 
    NANVL(null, 16),
    NANVL(1024, null),
    NANVL(null, null)
FROM DUAL;

Risultato:

   NANVL(NULL,16)    NANVL(1024,NULL)    NANVL(NULL,NULL) 
_________________ ___________________ ___________________ 
             null                null                null 

Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che si verifica un valore nullo come risultato di un SQL SELECT dichiarazione.

Tuttavia, puoi utilizzare SET NULL per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null deve essere restituito.

Argomenti mancanti

Chiamando NANVL() senza alcun argomento genera un errore:

SELECT NANVL()
FROM DUAL;

Risultato:

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:

E la stessa cosa vale quando lo si chiama con troppi argomenti:

SELECT NANVL(10, 2, 3)
FROM DUAL;

Risultato:

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: