Trong Oracle, REMAINDER()
hàm trả về phần còn lại của đối số đầu tiên chia cho đối số thứ hai.
Nó tương tự như MOD()
, ngoại trừ việc nó sử dụng ROUND()
trong tính toán của nó, trong khi MOD()
sử dụng FLOOR()
trong tính toán của nó.
Cú pháp
Cú pháp như sau:
REMAINDER(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ụ
Đây là một ví dụ:
SELECT REMAINDER(100, 6)
FROM DUAL;
Kết quả:
REMAINDER(100,6) ___________________ -2
REMAINDER()
so với MOD()
Kết quả trên có thể không mong muốn, đặc biệt là khi so sánh với MOD()
hàm số. Nhưng điều này là do MOD()
sử dụng FLOOR()
hàm trong công thức của nó, trong khi REMAINDER()
sử dụng ROUND()
hàm số.
Đây là hai chức năng được so sánh:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Kết quả:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
Trong trường hợp này, chúng tôi nhận được kết quả rất khác nhau từ hai hàm, mặc dù cả hai đều trả về phần còn lại của đối số đầu tiên chia cho đối số thứ hai của nó.
Chuyện gì đang xảy ra?
Có lẽ cách dễ nhất để nghĩ về nó là như thế này:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Kết quả:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
Trong trường hợp này, chúng tôi nhận được một kết quả khác, tùy thuộc vào việc chúng tôi sử dụng ROUND()
hoặc FLOOR()
.
- Nếu chúng ta nhân 17 với 6, chúng ta được 102. Điều này cho chúng ta phần dư là -2.
- Nếu nhân 16 với 6, chúng ta nhận được 96. Điều này cho chúng ta phần dư là 4.
Nếu chúng tôi thay đổi 6
thành 7
, cả hai hàm đều trả về cùng một kết quả:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Kết quả:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Và đây là nội dung ROUND()
và FLOOR()
trở lại:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Kết quả:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Đố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 REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Đối số rỗng
REMAINDER()
trả về null
nếu bất kỳ đối số nào là null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Kết quả:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(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 REMAINDER()
với số lượng đối số sai hoặc không có bất kỳ đối số nào dẫn đến lỗi:
SELECT REMAINDER()
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT REMAINDER() 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à:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Kết quả:
Error starting at line : 1 in command - SELECT REMAINDER(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: