W Oracle REMAINDER()
funkcja zwraca resztę pierwszego argumentu podzieloną przez drugi.
Jest podobny do MOD()
funkcja, z wyjątkiem tego, że używa ROUND()
w jego obliczeniach, podczas gdy MOD()
używa FLOOR()
w jego obliczeniach.
Składnia
Składnia wygląda tak:
REMAINDER(n2, n1)
Każdy argument może być dowolnym liczbowym typem danych lub dowolnym nienumerycznym typem danych, który można niejawnie przekonwertować na numeryczny typ danych.
Przykład
Oto przykład:
SELECT REMAINDER(100, 6)
FROM DUAL;
Wynik:
REMAINDER(100,6) ___________________ -2
REMAINDER()
vs MOD()
Powyższy wynik może wydawać się nieoczekiwany, szczególnie w porównaniu z MOD()
funkcjonować. Ale to dlatego, że MOD()
używa FLOOR()
funkcji w swojej formule, podczas gdy REMAINDER()
używa ROUND()
funkcjonować.
Oto dwie porównywane funkcje:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Wynik:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
W tym przypadku obie funkcje uzyskują bardzo różne wyniki, mimo że obie zwracają pozostałą część pierwszego argumentu podzieloną przez drugi.
Co się dzieje?
Być może najłatwiej o tym pomyśleć:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Wynik:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
W tym przypadku otrzymujemy inny wynik, w zależności od tego, czy używamy ROUND()
lub FLOOR()
.
- Jeśli pomnożymy 17 przez 6, otrzymamy 102. To daje nam resztę -2.
- Jeśli pomnożymy 16 przez 6, otrzymamy 96. To daje nam resztę z 4.
Jeśli zmienimy 6
do 7
, obie funkcje zwracają ten sam wynik:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Wynik:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
A oto, co ROUND()
i FLOOR()
powrót:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Wynik:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Argumenty nieliczbowe
Argumentami może być dowolny numeryczny typ danych lub dowolny nienumeryczny typ danych, który można niejawnie przekonwertować na numeryczny typ danych.
Oto przykład tego, co się dzieje, gdy argumenty nie spełniają tych kryteriów:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Argumenty zerowe
REMAINDER()
zwraca null
jeśli jakikolwiek argument jest null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Wynik:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
Domyślnie SQLcl i SQL*Plus zwracają spację za każdym razem, gdy w wyniku polecenia SQL SELECT
wystąpi wartość null oświadczenie.
Możesz jednak użyć SET NULL
aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null
należy zwrócić.
Brakujące argumenty
Wywołanie REMAINDER()
z niewłaściwą liczbą argumentów lub bez żadnych argumentów powoduje błąd:
SELECT REMAINDER()
FROM DUAL;
Wynik:
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:
Oraz:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Wynik:
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: