In Oracle, de REMAINDER()
functie retourneert de rest van zijn eerste argument gedeeld door zijn tweede.
Het is vergelijkbaar met de MOD()
functie, behalve dat het ROUND()
. gebruikt in zijn berekening, terwijl MOD()
gebruikt FLOOR()
in zijn berekening.
Syntaxis
De syntaxis gaat als volgt:
REMAINDER(n2, n1)
Elk argument kan elk numeriek gegevenstype zijn of elk niet-numeriek gegevenstype dat impliciet kan worden geconverteerd naar een numeriek gegevenstype.
Voorbeeld
Hier is een voorbeeld:
SELECT REMAINDER(100, 6)
FROM DUAL;
Resultaat:
REMAINDER(100,6) ___________________ -2
REMAINDER()
vs MOD()
Het bovenstaande resultaat kan onverwacht lijken, vooral in vergelijking met de MOD()
functie. Maar dit komt omdat MOD()
gebruikt de FLOOR()
functie in zijn formule, terwijl REMAINDER()
gebruikt de ROUND()
functie.
Hier zijn de twee functies vergeleken:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Resultaat:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
In dit geval krijgen we enorm verschillende resultaten van de twee functies, ook al retourneren ze allebei de rest van het eerste argument gedeeld door het tweede.
Wat is er aan de hand?
Misschien is de gemakkelijkste manier om erover na te denken als volgt:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Resultaat:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
In dit geval krijgen we een ander resultaat, afhankelijk van of we ROUND()
. gebruiken of FLOOR()
.
- Als we 17 met 6 vermenigvuldigen, krijgen we 102. Dit geeft ons een rest van -2.
- Als we 16 met 6 vermenigvuldigen, krijgen we 96. Dit geeft ons een rest van 4.
Als we de 6
. wijzigen naar een 7
, beide functies geven hetzelfde resultaat:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Resultaat:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
En dit is wat ROUND()
en FLOOR()
retour:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Resultaat:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Niet-numerieke argumenten
De argumenten kunnen elk numeriek gegevenstype zijn of elk niet-numeriek gegevenstype dat impliciet kan worden geconverteerd naar een numeriek gegevenstype.
Hier is een voorbeeld van wat er gebeurt als de argumenten niet aan die criteria voldoen:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Resultaat:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Nullargumenten
REMAINDER()
retourneert null
als een argument null
is :
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Resultaat:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
Standaard retourneren SQLcl en SQL*Plus een spatie wanneer een null-waarde optreedt als resultaat van een SQL SELECT
uitspraak.
U kunt echter SET NULL
. gebruiken om een andere tekenreeks op te geven die moet worden geretourneerd. Hier heb ik gespecificeerd dat de string null
moet worden geretourneerd.
Ontbrekende argumenten
REMAINDER()
. aanroepen met het verkeerde aantal argumenten, of zonder argumenten resulteert in een fout:
SELECT REMAINDER()
FROM DUAL;
Resultaat:
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:
En:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Resultaat:
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: