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

Hàm REMAINDER () trong Oracle

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()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:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để lấy kiểu dữ liệu cột trong Oracle với PL-SQL với đặc quyền thấp?

  2. làm thế nào để khai báo% ROWTYPE của một biến SYS_REFCURSOR được nhập yếu?

  3. Tên cột bảng Oracle có khoảng trắng

  4. Chạy Tổng số theo Nhóm SQL (Oracle)

  5. Sự kiện chờ:thay đổi kích thước bộ mô tả asynch