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: