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: