I Oracle, REMAINDER()
funktion returnerar resten av dess första argument dividerat med dess andra.
Det liknar MOD()
funktion, förutom att den använder ROUND()
i sin beräkning, medan MOD()
använder FLOOR()
i sin beräkning.
Syntax
Syntaxen ser ut så här:
REMAINDER(n2, n1)
Varje argument kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.
Exempel
Här är ett exempel:
SELECT REMAINDER(100, 6)
FROM DUAL;
Resultat:
REMAINDER(100,6) ___________________ -2
REMAINDER()
kontra MOD()
Ovanstående resultat kan tyckas vara oväntat, speciellt i jämförelse med MOD()
fungera. Men detta beror på att MOD()
använder FLOOR()
funktion i sin formel, medan REMAINDER()
använder ROUND()
fungera.
Här är de två funktionerna som jämförs:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Resultat:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
I det här fallet får vi väldigt olika resultat från de två funktionerna, även om de båda returnerar resten av dess första argument dividerat med dess andra.
Vad händer?
Det kanske enklaste sättet att tänka på det är så här:
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 det här fallet får vi ett annat resultat, beroende på om vi använder ROUND()
eller FLOOR()
.
- Om vi multiplicerar 17 med 6 får vi 102. Detta ger oss en återstod på -2.
- Om vi multiplicerar 16 med 6 får vi 96. Detta ger oss en återstod av 4.
Om vi ändrar 6
till en 7
, ger båda funktionerna samma resultat:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Resultat:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Och här är vad ROUND()
och FLOOR()
returnera:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Resultat:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Icke-numeriska argument
Argumenten kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.
Här är ett exempel på vad som händer när argumenten inte uppfyller dessa 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
Nollargument
REMAINDER()
returnerar null
om något argument är 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 returnerar SQLcl och SQL*Plus ett tomt utrymme när ett nollvärde inträffar som ett resultat av en SQL SELECT
påstående.
Du kan dock använda SET NULL
för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null
bör returneras.
Argument saknas
Anropar REMAINDER()
med fel antal argument, eller utan några argument resulterar i ett fel:
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:
Och:
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: