Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction REMAINDER() dans Oracle

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: