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 là 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: