I Oracle, NANVL()
funktionen tillåter oss att hantera NaN
värden genom att ange ett annat nummer som ska returneras i dess ställe.
Hur det fungerar är att det accepterar två argument. Om det första argumentet är NaN
(inte ett tal), returnerar det det andra argumentet. Om det första argumentet är ett nummer, så returnerar det helt enkelt det numret.
Observera att den här funktionen endast är användbar för flyttal av typen BINARY_FLOAT
eller BINARY_DOUBLE
.
Syntax
Syntaxen ser ut så här:
NANVL(n2, n1)
Varje argument kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.
Exempel
Vi kan producera NaN
genom att dividera ett nollflytande/dubbelvärde med noll:
SELECT 0f/0
FROM DUAL;
Resultat:
0F/0 _______ NaN
Men om vi inte vill ha NaN
för att returneras kan vi använda NANVL()
funktion för att returnera ett annat värde:
SELECT NANVL(0f/0, 0)
FROM DUAL;
Resultat:
NANVL(0F/0,0) ________________ 0.0
Här är det igen, men den här gången anger vi ett annat värde som ska returneras i stället för NaN
:
SELECT NANVL(0f/0, 123)
FROM DUAL;
Resultat:
NANVL(0F/0,123) __________________ 123.0
NaN
Flytande punkt bokstavlig
Oracle tillhandahåller också några flytande-komma-literaler för situationer som inte kan uttryckas som en numerisk bokstavlig. Dessa inkluderar binary_float_nan
som representerar ett värde av typen BINARY_FLOAT
för vilket villkoret IS
NAN
är sant och binary_double_nan
, som representerar ett värde av typen BINARY_DOUBLE
för vilket villkoret IS
NAN
är sant.
Här är ett exempel på hur du använder dessa flyttalsliteraler istället:
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
Att skicka ett nummer
Som nämnts, om det första argumentet är ett tal, returnerar det det numret:
SELECT NANVL(33, 0)
FROM DUAL;
Resultat:
NANVL(33,0) ______________ 33
Icke-numeriska argument
Argumenten kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.
Här är ett exempel på vad som händer när argumenten inte uppfyller dessa 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
Nollargument
NANVL()
returnerar null
om något argument är 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 returnerar SQLcl och SQL*Plus ett blanksteg närhelst ett nollvärde inträffar som ett resultat av en SQL SELECT
påstående.
Du kan dock använda SET NULL
för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null
bör returneras.
Argument saknas
Anropar NANVL()
utan några argument resulterar i ett fel:
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:
Och samma sak gäller när man kallar det med för många argument:
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: