I Oracle er NANVL()
funktion giver os mulighed for at håndtere NaN
værdier ved at angive et andet tal, der skal returneres i stedet for.
Den måde, det fungerer på, er, at det accepterer to argumenter. Hvis det første argument er NaN
(ikke et tal), returnerer det det andet argument. Hvis det første argument er et tal, så returnerer den simpelthen det tal.
Bemærk, at denne funktion kun er nyttig for flydende kommatal af typen BINARY_FLOAT
eller BINARY_DOUBLE
.
Syntaks
Syntaksen ser sådan ud:
NANVL(n2, n1)
Hvert argument kan være enhver numerisk datatype eller enhver ikke-numerisk datatype, der implicit kan konverteres til en numerisk datatype.
Eksempel
Vi kan producere NaN
ved at dividere en float/dobbelt værdi på nul med nul:
SELECT 0f/0
FROM DUAL;
Resultat:
0F/0 _______ NaN
Men hvis vi ikke vil have NaN
for at blive returneret, kan vi bruge NANVL()
funktion for at returnere en anden værdi:
SELECT NANVL(0f/0, 0)
FROM DUAL;
Resultat:
NANVL(0F/0,0) ________________ 0.0
Her er det igen, men denne gang angiver vi en anden værdi, der skal returneres i stedet for NaN
:
SELECT NANVL(0f/0, 123)
FROM DUAL;
Resultat:
NANVL(0F/0,123) __________________ 123.0
NaN
Floating-Point Literal
Oracle giver også nogle bogstaver med flydende komma til situationer, der ikke kan udtrykkes som et numerisk bogstav. Disse inkluderer binary_float_nan
som repræsenterer en værdi af typen BINARY_FLOAT
for hvilken betingelsen IS
NAN
er sand, og binary_double_nan
, som repræsenterer en værdi af typen BINARY_DOUBLE
for hvilken betingelsen IS
NAN
er sandt.
Her er et eksempel på at bruge disse bogstaver med flydende komma i stedet:
SELECT
NANVL(binary_double_nan, 0),
NANVL(binary_float_nan, 0)
FROM DUAL;
Resultat:
NANVL(BINARY_DOUBLE_NAN,0) NANVL(BINARY_FLOAT_NAN,0) _____________________________ ____________________________ 0.0 0.0
Videre et nummer
Som nævnt, hvis det første argument er et tal, returnerer det dette tal:
SELECT NANVL(33, 0)
FROM DUAL;
Resultat:
NANVL(33,0) ______________ 33
Ikke-numeriske argumenter
Argumenterne kan være enhver numerisk datatype eller enhver ikke-numerisk datatype, der implicit kan konverteres til en numerisk datatype.
Her er et eksempel på, hvad der sker, når argumenterne ikke opfylder disse kriterier:
SELECT NANVL('Gosh', 'Dang')
FROM DUAL;
Resultat:
Error starting at line : 1 in command - SELECT NANVL('Gosh', 'Dang') FROM DUAL Error report - ORA-01722: invalid number
Nul-argumenter
NANVL()
returnerer null
hvis et argument er null
:
SET NULL 'null';
SELECT
NANVL(null, 16),
NANVL(1024, null),
NANVL(null, null)
FROM DUAL;
Resultat:
NANVL(NULL,16) NANVL(1024,NULL) NANVL(NULL,NULL) _________________ ___________________ ___________________ null null null
Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når der opstår en null-værdi som et resultat af en SQL SELECT
udmelding.
Du kan dog bruge SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null
skal returneres.
Manglende argumenter
Kalder NANVL()
uden argumenter resulterer i en fejl:
SELECT NANVL()
FROM DUAL;
Resultat:
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:
Og det samme gælder, når man kalder det med for mange argumenter:
SELECT NANVL(10, 2, 3)
FROM DUAL;
Resultat:
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: