В Oracle, REMAINDER()
функцията връща остатъка от първия си аргумент, разделен на втория.
Това е подобно на MOD()
функция, с изключение на това, че използва ROUND()
в неговото изчисление, докато MOD()
използва FLOOR()
в нейното изчисление.
Синтаксис
Синтаксисът е така:
REMAINDER(n2, n1)
Всеки аргумент може да бъде произволен числов тип данни или всеки нечисловен тип данни, който може да бъде имплицитно преобразуван в числов тип данни.
Пример
Ето един пример:
SELECT REMAINDER(100, 6)
FROM DUAL;
Резултат:
REMAINDER(100,6) ___________________ -2
REMAINDER()
срещу MOD()
Горният резултат може да изглежда неочакван, особено в сравнение с MOD()
функция. Но това е така, защото MOD()
използва FLOOR()
функция във формулата си, докато REMAINDER()
използва ROUND()
функция.
Ето двете сравнени функции:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Резултат:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
В този случай получаваме значително различни резултати от двете функции, въпреки че и двете връщат остатъка от първия аргумент, разделен на втория.
Какво става?
Може би най-лесният начин да мислите за това е така:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Резултат:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
В този случай получаваме различен резултат, в зависимост от това дали използваме ROUND()
или FLOOR()
.
- Ако умножим 17 по 6, получаваме 102. Това ни дава остатък от -2.
- Ако умножим 16 по 6, получаваме 96. Това ни дава остатъка от 4.
Ако променим 6
до 7
, и двете функции връщат един и същ резултат:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Резултат:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
И ето какво означава ROUND()
и FLOOR()
връщане:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Резултат:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Нечислови аргументи
Аргументите могат да бъдат всеки числов тип данни или всеки нечисловен тип данни, които могат да бъдат имплицитно преобразувани в числов тип данни.
Ето пример за това какво се случва, когато аргументите не отговарят на тези критерии:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Резултат:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Нулеви аргументи
REMAINDER()
връща null
ако някой аргумент е null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Резултат:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
По подразбиране SQLcl и SQL*Plus връщат празно пространство, когато се появи нулева стойност в резултат на SQL SELECT
изявление.
Можете обаче да използвате SET NULL
за да посочите различен низ, който да бъде върнат. Тук посочих, че низът null
трябва да бъдат върнати.
Липсващи аргументи
Извикване на REMAINDER()
с грешен брой аргументи или без никакви аргументи води до грешка:
SELECT REMAINDER()
FROM DUAL;
Резултат:
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:
И:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Резултат:
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: