В 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: