Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja NANVL() w Oracle

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:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy można tworzyć typy obiektów Oracle Database w PL/SQL?

  2. ORA-12505, TNS:listener nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia

  3. Filtrowanie dzienników alertów w EM13c

  4. TO_YMINTERVAL() Funkcja w Oracle

  5. Oracle:jak uzyskać procent całości za pomocą zapytania?