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: