In Oracle, il REMAINDER()
funzione restituisce il resto del suo primo argomento diviso per il secondo.
È simile a MOD()
funzione, tranne per il fatto che utilizza ROUND()
nel suo calcolo, mentre MOD()
utilizza FLOOR()
nel suo calcolo.
Sintassi
La sintassi è questa:
REMAINDER(n2, n1)
Ogni argomento può essere qualsiasi tipo di dati numerico o qualsiasi tipo di dati non numerico che può essere convertito in modo implicito in un tipo di dati numerico.
Esempio
Ecco un esempio:
SELECT REMAINDER(100, 6)
FROM DUAL;
Risultato:
REMAINDER(100,6) ___________________ -2
REMAINDER()
rispetto a MOD()
Il risultato di cui sopra potrebbe sembrare inaspettato, specialmente se confrontato con MOD()
funzione. Ma questo perché MOD()
usa il FLOOR()
funzione nella sua formula, mentre REMAINDER()
usa il ROUND()
funzione.
Ecco le due funzioni a confronto:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Risultato:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
In questo caso, otteniamo risultati molto diversi dalle due funzioni, anche se entrambe restituiscono il resto del primo argomento diviso per il secondo.
Cosa sta succedendo?
Forse il modo più semplice per pensarci è questo:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Risultato:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
In questo caso otteniamo un risultato diverso, a seconda che utilizziamo ROUND()
o FLOOR()
.
- Se moltiplichiamo 17 per 6, otteniamo 102. Questo ci dà un resto di -2.
- Se moltiplichiamo 16 per 6, otteniamo 96. Questo ci dà un resto di 4.
Se cambiamo il 6
a un 7
, entrambe le funzioni restituiscono lo stesso risultato:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Risultato:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Ed ecco cosa ROUND()
e FLOOR()
ritorno:
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Risultato:
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Argomenti non numerici
Gli argomenti possono essere qualsiasi tipo di dati numerico o qualsiasi tipo di dati non numerico che può essere convertito in modo implicito in un tipo di dati numerico.
Ecco un esempio di cosa succede quando gli argomenti non soddisfano quel criterio:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Risultato:
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Argomenti nulli
REMAINDER()
restituisce null
se un argomento è null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Risultato:
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
Per impostazione predefinita, SQLcl e SQL*Plus restituiscono uno spazio vuoto ogni volta che si verifica un valore nullo come risultato di un SQL SELECT
dichiarazione.
Tuttavia, puoi utilizzare SET NULL
per specificare una stringa diversa da restituire. Qui ho specificato che la stringa null
deve essere restituito.
Argomenti mancanti
Chiamando REMAINDER()
con il numero errato di argomenti o senza argomenti genera un errore:
SELECT REMAINDER()
FROM DUAL;
Risultato:
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:
E:
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Risultato:
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: