В Oracle, NANVL() функцията ни позволява да се справим с NaN стойности, като посочите друго число, което да се върне на негово място.
Начинът, по който работи, е, че приема два аргумента. Ако първият аргумент е NaN (не число), той връща втория аргумент. Ако първият аргумент е число, след което просто връща това число.
Имайте предвид, че тази функция е полезна само за числа с плаваща запетая от тип BINARY_FLOAT или BINARY_DOUBLE .
Синтаксис
Синтаксисът е така:
NANVL(n2, n1) Всеки аргумент може да бъде произволен числов тип данни или всеки нечисловен тип данни, който може да бъде имплицитно преобразуван в числов тип данни.
Пример
Можем да произведем NaN чрез разделяне на нула float/удвоена стойност на нула:
SELECT 0f/0
FROM DUAL; Резултат:
0F/0 _______ NaN
Но ако не искаме NaN за да бъдат върнати, можем да използваме NANVL() функция за връщане на различна стойност:
SELECT NANVL(0f/0, 0)
FROM DUAL; Резултат:
NANVL(0F/0,0) ________________ 0.0
Ето го отново, но този път посочваме различна стойност, която да се върне на мястото на NaN :
SELECT NANVL(0f/0, 123)
FROM DUAL; Резултат:
NANVL(0F/0,123) __________________ 123.0
NaN Литерал с плаваща запетая
Oracle също така предоставя някои литерали с плаваща запетая за ситуации, които не могат да бъдат изразени като числов литерал. Те включват binary_float_nan което представлява стойност от тип BINARY_FLOAT за които условието IS NAN е вярно и binary_double_nan , което представлява стойност от тип BINARY_DOUBLE за които условието IS NAN е вярно.
Ето пример за използване на тези литерали с плаваща запетая вместо това:
SELECT
NANVL(binary_double_nan, 0),
NANVL(binary_float_nan, 0)
FROM DUAL; Резултат:
NANVL(BINARY_DOUBLE_NAN,0) NANVL(BINARY_FLOAT_NAN,0) _____________________________ ____________________________ 0.0 0.0
Предаване на номер
Както споменахме, ако първият аргумент е число, тогава той връща това число:
SELECT NANVL(33, 0)
FROM DUAL; Резултат:
NANVL(33,0)
______________
33 Нечислови аргументи
Аргументите могат да бъдат всеки числов тип данни или всеки нечисловен тип данни, които могат да бъдат имплицитно преобразувани в числов тип данни.
Ето пример за това какво се случва, когато аргументите не отговарят на тези критерии:
SELECT NANVL('Gosh', 'Dang')
FROM DUAL; Резултат:
Error starting at line : 1 in command -
SELECT NANVL('Gosh', 'Dang')
FROM DUAL
Error report -
ORA-01722: invalid number Нулеви аргументи
NANVL() връща null ако някой аргумент е null :
SET NULL 'null';
SELECT
NANVL(null, 16),
NANVL(1024, null),
NANVL(null, null)
FROM DUAL; Резултат:
NANVL(NULL,16) NANVL(1024,NULL) NANVL(NULL,NULL)
_________________ ___________________ ___________________
null null null
По подразбиране SQLcl и SQL*Plus връщат празно пространство, когато се появи нулева стойност в резултат на SQL SELECT изявление.
Можете обаче да използвате SET NULL за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null трябва да бъдат върнати.
Липсващи аргументи
Извикване на NANVL() без никакви аргументи води до грешка:
SELECT NANVL()
FROM DUAL; Резултат:
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:
Същото важи и при извикването му с твърде много аргументи:
SELECT NANVL(10, 2, 3)
FROM DUAL; Резултат:
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: