Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função REMAIDER() no Oracle


No Oracle, o REMAINDER() A função retorna o restante de seu primeiro argumento dividido por seu segundo.

É semelhante ao MOD() função, exceto que ela usa ROUND() em seu cálculo, enquanto MOD() usa FLOOR() em seu cálculo.

Sintaxe


A sintaxe fica assim:
REMAINDER(n2, n1)

Cada argumento pode ser qualquer tipo de dados numérico ou qualquer tipo de dados não numérico que possa ser convertido implicitamente em um tipo de dados numérico.

Exemplo


Aqui está um exemplo:
SELECT REMAINDER(100, 6)
FROM DUAL;

Resultado:
   REMAINDER(100,6) 
___________________ 
                 -2 

REMAINDER() vs MOD()


O resultado acima pode parecer inesperado, especialmente quando comparado ao MOD() função. Mas isso ocorre porque MOD() usa o FLOOR() função em sua fórmula, enquanto REMAINDER() usa o ROUND() função.

Aqui estão as duas funções comparadas:
SELECT 
    REMAINDER(100, 6),
    MOD(100, 6)
FROM DUAL;

Resultado:
   REMAINDER(100,6)    MOD(100,6) 
___________________ _____________ 
                 -2             4

Nesse caso, obtemos resultados muito diferentes das duas funções, mesmo que ambas retornem o restante do primeiro argumento dividido pelo segundo.

O que está acontecendo?

Talvez a maneira mais fácil de pensar sobre isso seja assim:
SELECT 
    100/6,
    ROUND(100/6) AS "ROUND()",
    FLOOR(100/6) AS "FLOOR()"
FROM DUAL;

Resultado:
     100/6    ROUND()    FLOOR()
---------- ---------- ----------
16.6666667         17         16

Neste caso, obtemos um resultado diferente, dependendo se usamos ROUND() ou FLOOR() .
  • Se multiplicarmos 17 por 6, obtemos 102. Isso nos dá um resto de -2.
  • Se multiplicarmos 16 por 6, obtemos 96. Isso nos dá um resto de 4.

Se alterarmos o 6 para um 7 , ambas as funções retornam o mesmo resultado:
SELECT 
    REMAINDER(100, 7),
    MOD(100, 7)
FROM DUAL;

Resultado:
   REMAINDER(100,7)    MOD(100,7) 
___________________ _____________ 
                  2             2 

E aqui está o que ROUND() e FLOOR() Retorna:
SELECT 
    100/7,
    ROUND(100/7) AS "ROUND()",
    FLOOR(100/7) AS "FLOOR()"
FROM DUAL;

Resultado:
     100/7    ROUND()    FLOOR()
---------- ---------- ----------
14.2857143         14         14

Argumentos não numéricos


Os argumentos podem ser qualquer tipo de dados numérico ou qualquer tipo de dados não numérico que possa ser convertido implicitamente em um tipo de dados numérico.

Aqui está um exemplo do que acontece quando os argumentos não satisfazem esse critério:
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;

Resultado:
Error starting at line : 1 in command -
SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL
Error report -
ORA-01722: invalid number

Argumentos nulos


REMAINDER() retorna null se algum argumento for null :
SET NULL 'null';

SELECT 
    REMAINDER(null, 2),
    REMAINDER(7, null),
    REMAINDER(null, null)
FROM DUAL;

Resultado:
   REMAINDER(NULL,2)    REMAINDER(7,NULL)    REMAINDER(NULL,NULL) 
____________________ ____________________ _______________________ 
                null                 null                    null

Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que um valor nulo ocorre como resultado de um SQL SELECT demonstração.

No entanto, você pode usar SET NULL para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null deve ser devolvido.

Argumentos ausentes


Chamando REMAINDER() com o número errado de argumentos ou sem argumentos resulta em um erro:
SELECT REMAINDER()
FROM DUAL;

Resultado:
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;

Resultado:
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: