W Oracle NANVL()
funkcja pozwala nam poradzić sobie z NaN
wartości, określając inną liczbę, która ma zostać zwrócona w jej miejsce.
Działa to tak, że przyjmuje dwa argumenty. Jeśli pierwszym argumentem jest NaN
(nie liczba), zwraca drugi argument. Jeśli pierwszym argumentem jest liczbę, to po prostu zwraca tę liczbę.
Zauważ, że ta funkcja jest przydatna tylko dla liczb zmiennoprzecinkowych typu BINARY_FLOAT
lub BINARY_DOUBLE
.
Składnia
Składnia wygląda tak:
NANVL(n2, n1)
Każdy argument może być dowolnym numerycznym typem danych lub dowolnym nienumerycznym typem danych, który można niejawnie przekonwertować na numeryczny typ danych.
Przykład
Możemy wyprodukować NaN
dzieląc zerową wartość zmiennoprzecinkową/podwójną przez zero:
SELECT 0f/0
FROM DUAL;
Wynik:
0F/0 _______ NaN
Ale jeśli nie chcemy NaN
do zwrócenia, możemy użyć NANVL()
funkcja zwracająca inną wartość:
SELECT NANVL(0f/0, 0)
FROM DUAL;
Wynik:
NANVL(0F/0,0) ________________ 0.0
Tutaj znowu, ale tym razem określamy inną wartość do zwrócenia w miejsce NaN
:
SELECT NANVL(0f/0, 123)
FROM DUAL;
Wynik:
NANVL(0F/0,123) __________________ 123.0
NaN
Literał zmiennoprzecinkowy
Oracle udostępnia również kilka literałów zmiennoprzecinkowych dla sytuacji, których nie można wyrazić jako literał liczbowy. Należą do nich binary_float_nan
która reprezentuje wartość typu BINARY_FLOAT
dla którego warunek IS
NAN
jest prawdziwe, a binary_double_nan
, który reprezentuje wartość typu BINARY_DOUBLE
dla którego warunek IS
NAN
to prawda.
Oto przykład użycia tych literałów zmiennoprzecinkowych:
SELECT
NANVL(binary_double_nan, 0),
NANVL(binary_float_nan, 0)
FROM DUAL;
Wynik:
NANVL(BINARY_DOUBLE_NAN,0) NANVL(BINARY_FLOAT_NAN,0) _____________________________ ____________________________ 0.0 0.0
Przekazywanie numeru
Jak wspomniano, jeśli pierwszy argument jest liczbą, to zwraca tę liczbę:
SELECT NANVL(33, 0)
FROM DUAL;
Wynik:
NANVL(33,0) ______________ 33
Argumenty nieliczbowe
Argumentami może być dowolny numeryczny typ danych lub dowolny nienumeryczny typ danych, który można niejawnie przekonwertować na numeryczny typ danych.
Oto przykład tego, co się dzieje, gdy argumenty nie spełniają tych kryteriów:
SELECT NANVL('Gosh', 'Dang')
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT NANVL('Gosh', 'Dang') FROM DUAL Error report - ORA-01722: invalid number
Argumenty zerowe
NANVL()
zwraca null
jeśli jakikolwiek argument jest null
:
SET NULL 'null';
SELECT
NANVL(null, 16),
NANVL(1024, null),
NANVL(null, null)
FROM DUAL;
Wynik:
NANVL(NULL,16) NANVL(1024,NULL) NANVL(NULL,NULL) _________________ ___________________ ___________________ null null null
Domyślnie SQLcl i SQL*Plus zwracają spację za każdym razem, gdy w wyniku polecenia SQL SELECT
wystąpi wartość null oświadczenie.
Możesz jednak użyć SET NULL
aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null
należy zwrócić.
Brakujące argumenty
Wywołanie NANVL()
bez żadnych argumentów powoduje błąd:
SELECT NANVL()
FROM DUAL;
Wynik:
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:
I to samo dotyczy wywoływania go ze zbyt dużą liczbą argumentów:
SELECT NANVL(10, 2, 3)
FROM DUAL;
Wynik:
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: