Dans Oracle, le REMAINDER()
fonction renvoie le reste de son premier argument divisé par son second.
C'est similaire au MOD()
fonction, sauf qu'elle utilise ROUND()
dans son calcul, alors que MOD()
utilise FLOOR()
dans son calcul.
Syntaxe
La syntaxe ressemble à ceci :
REMAINDER(n2, n1)
Chaque argument peut être n'importe quel type de données numérique ou n'importe quel type de données non numérique qui peut être implicitement converti en un type de données numérique.
Exemple
Voici un exemple :
SELECT REMAINDER(100, 6)
FROM DUAL;
Résultat :
REMAINDER(100,6) ___________________ -2
REMAINDER()
contre MOD()
Le résultat ci-dessus peut sembler inattendu, en particulier lorsqu'il est comparé au MOD()
une fonction. Mais c'est parce que MOD()
utilise le FLOOR()
fonction dans sa formule, tandis que REMAINDER()
utilise le ROUND()
une fonction.
Voici les deux fonctions comparées :
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Résultat :
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
Dans ce cas, nous obtenons des résultats très différents des deux fonctions, même si elles renvoient toutes deux le reste de son premier argument divisé par son second.
Que se passe-t-il ?
La façon la plus simple d'y penser est peut-être la suivante :
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Résultat :
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
Dans ce cas, nous obtenons un résultat différent, selon que nous utilisons ROUND()
ou FLOOR()
.
- Si nous multiplions 17 par 6, nous obtenons 102. Cela nous donne un reste de -2.
- Si nous multiplions 16 par 6, nous obtenons 96. Cela nous donne un reste de 4.
Si nous changeons le 6
à un 7
, les deux fonctions renvoient le même résultat :
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Résultat :
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Et voici ce que ROUND()
et FLOOR()
retour :
SELECT
100/7,
ROUND(100/7) AS "ROUND()",
FLOOR(100/7) AS "FLOOR()"
FROM DUAL;
Résultat :
100/7 ROUND() FLOOR() ---------- ---------- ---------- 14.2857143 14 14
Arguments non numériques
Les arguments peuvent être n'importe quel type de données numérique ou n'importe quel type de données non numérique qui peut être implicitement converti en un type de données numérique.
Voici un exemple de ce qui se passe lorsque les arguments ne satisfont pas à ce critère :
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;
Résultat :
Error starting at line : 1 in command - SELECT REMAINDER('Ponzi', 'Invest') FROM DUAL Error report - ORA-01722: invalid number
Arguments nuls
REMAINDER()
renvoie null
si un argument est null
:
SET NULL 'null';
SELECT
REMAINDER(null, 2),
REMAINDER(7, null),
REMAINDER(null, null)
FROM DUAL;
Résultat :
REMAINDER(NULL,2) REMAINDER(7,NULL) REMAINDER(NULL,NULL) ____________________ ____________________ _______________________ null null null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois qu'une valeur nulle se produit à la suite d'un SQL SELECT
déclaration.
Cependant, vous pouvez utiliser SET NULL
pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null
doit être retourné.
Arguments manquants
Appel de REMAINDER()
avec le mauvais nombre d'arguments, ou sans aucun argument entraîne une erreur :
SELECT REMAINDER()
FROM DUAL;
Résultat :
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:
Et :
SELECT REMAINDER(10, 2, 3)
FROM DUAL;
Résultat :
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: