Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hàm NANVL () trong Oracle

Trong Oracle, NANVL() cho phép chúng tôi xử lý NaN giá trị bằng cách chỉ định một số khác để trả về vị trí của nó.

Cách thức hoạt động của nó là, nó chấp nhận hai đối số. Nếu đối số đầu tiên là NaN (không phải số), nó trả về đối số thứ hai. Nếu đối số đầu tiên một số, sau đó nó chỉ trả về số đó.

Lưu ý rằng chức năng này chỉ hữu ích cho các số dấu phẩy động thuộc loại BINARY_FLOAT hoặc BINARY_DOUBLE .

Cú pháp

Cú pháp như sau:

NANVL(n2, n1)

Mỗi đối số có thể là bất kỳ kiểu dữ liệu số hoặc bất kỳ kiểu dữ liệu không phải số nào có thể được chuyển đổi hoàn toàn thành kiểu dữ liệu số.

Ví dụ

Chúng tôi có thể sản xuất NaN bằng cách chia giá trị float / double 0 cho 0:

SELECT 0f/0 
FROM DUAL;

Kết quả:

   0F/0 
_______ 
NaN     

Nhưng nếu chúng ta không muốn NaN để được trả lại, chúng ta có thể sử dụng NANVL() hàm để trả về một giá trị khác:

SELECT NANVL(0f/0, 0) 
FROM DUAL;

Kết quả:

   NANVL(0F/0,0) 
________________ 
0.0             

Đây là một lần nữa, nhưng lần này chúng tôi chỉ định một giá trị khác để trả về thay cho NaN :

SELECT NANVL(0f/0, 123) 
FROM DUAL;

Kết quả:

   NANVL(0F/0,123) 
__________________ 
123.0              

NaN Floating-Point Literal

Oracle cũng cung cấp một số ký tự dấu phẩy động cho các trường hợp không thể được biểu thị dưới dạng ký tự số. Chúng bao gồm binary_float_nan đại diện cho một giá trị của loại BINARY_FLOAT mà điều kiện IS NAN là true và binary_double_nan , đại diện cho một giá trị của loại BINARY_DOUBLE mà điều kiện IS NAN là đúng.

Dưới đây là một ví dụ về việc sử dụng các ký tự dấu phẩy động này thay thế:

SELECT 
    NANVL(binary_double_nan, 0), 
    NANVL(binary_float_nan, 0)
FROM DUAL;

Kết quả:

   NANVL(BINARY_DOUBLE_NAN,0)    NANVL(BINARY_FLOAT_NAN,0) 
_____________________________ ____________________________ 
0.0                           0.0                         

Chuyển một số

Như đã đề cập, nếu đối số đầu tiên là một số, thì nó sẽ trả về số đó:

SELECT NANVL(33, 0) 
FROM DUAL;

Kết quả:

   NANVL(33,0) 
______________ 
            33 

Đối số không phải dạng số

Các đối số có thể là bất kỳ kiểu dữ liệu số nào hoặc bất kỳ kiểu dữ liệu phi số nào có thể được chuyển đổi hoàn toàn thành kiểu dữ liệu số.

Dưới đây là một ví dụ về điều gì sẽ xảy ra khi các đối số không đáp ứng tiêu chí đó:

SELECT NANVL('Gosh', 'Dang')
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT NANVL('Gosh', 'Dang')
FROM DUAL
Error report -
ORA-01722: invalid number

Đối số rỗng

NANVL() trả về null nếu bất kỳ đối số nào là null :

SET NULL 'null';

SELECT 
    NANVL(null, 16),
    NANVL(1024, null),
    NANVL(null, null)
FROM DUAL;

Kết quả:

   NANVL(NULL,16)    NANVL(1024,NULL)    NANVL(NULL,NULL) 
_________________ ___________________ ___________________ 
             null                null                null 

Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào giá trị null xảy ra do một SELECT trong SQL tuyên bố.

Tuy nhiên, bạn có thể sử dụng SET NULL để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null nên được trả lại.

Thiếu đối số

Gọi NANVL() mà không có bất kỳ đối số nào dẫn đến lỗi:

SELECT NANVL()
FROM DUAL;

Kết quả:

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:

Và điều tương tự cũng áp dụng khi gọi nó với quá nhiều đối số:

SELECT NANVL(10, 2, 3)
FROM DUAL;

Kết quả:

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. Khu vực phục hồi nhanh của Oracle

  2. Cơ chế theo sau của Oracle khi chúng tôi sao lưu nóng

  3. Cách tạo dấu vết FRD trong Oracle Apps 11i / R12

  4. ORA-6502 với Trình kích hoạt ghi nhật ký cấp

  5. Webrick phản hồi rất chậm. Làm thế nào để tăng tốc độ?