I Oracle er REMAINDER()
funktion returnerer resten af dets første argument divideret med dets andet.
Det ligner MOD()
funktion, bortset fra at den bruger ROUND()
i sin beregning, hvorimod MOD()
bruger FLOOR()
i sin beregning.
Syntaks
Syntaksen ser sådan ud:
REMAINDER(n2, n1)
Hvert argument kan være enhver numerisk datatype eller enhver ikke-numerisk datatype, der implicit kan konverteres til en numerisk datatype.
Eksempel
Her er et eksempel:
SELECT REMAINDER(100, 6)
FROM DUAL;
Resultat:
REMAINDER(100,6) ___________________ -2
REMAINDER()
vs MOD()
Ovenstående resultat kan se ud til at være uventet, især sammenlignet med MOD()
fungere. Men det er fordi MOD()
bruger FLOOR()
funktion i sin formel, mens REMAINDER()
bruger ROUND()
fungere.
Her er de to funktioner sammenlignet:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Resultat:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
I dette tilfælde får vi vidt forskellige resultater fra de to funktioner, selvom de begge returnerer resten af dets første argument divideret med dets andet.
Hvad sker der?
Måske er den nemmeste måde at tænke på sådan her:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Resultat:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
I dette tilfælde får vi et andet resultat, afhængigt af om vi bruger ROUND()
eller FLOOR()
.
- Hvis vi ganger 17 med 6, får vi 102. Dette giver os en rest på -2.
- Hvis vi ganger 16 med 6, får vi 96. Dette giver os en rest på 4.
Hvis vi ændrer 6
til en 7
, returnerer begge funktioner det samme resultat:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Resultat:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Og her er hvad ROUND()
og FLOOR()
returnere:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Resultat:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Ikke-numeriske argumenter
Argumenterne kan være enhver numerisk datatype eller enhver ikke-numerisk datatype, der implicit kan konverteres til en numerisk datatype.
Her er et eksempel på, hvad der sker, når argumenterne ikke opfylder disse kriterier:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Resultat:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Nul-argumenter
REMAINDER()
returnerer null
hvis et argument er null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Resultat:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
Som standard returnerer SQLcl og SQL*Plus et tomt mellemrum, når der opstår en null-værdi som et resultat af en SQL SELECT
udmelding.
Du kan dog bruge SET NULL
for at angive en anden streng, der skal returneres. Her specificerede jeg, at strengen null
skal returneres.
Manglende argumenter
Kalder REMAINDER()
med det forkerte antal argumenter eller uden argumenter resulterer i en fejl:
SELECT REMAINDER()
FROM DUAL;
Resultat:
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:
Og:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Resultat:
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: