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: