En Oracle, el REMAINDER()
función devuelve el resto de su primer argumento dividido por su segundo.
Es similar al MOD()
función, excepto que usa ROUND()
en su cálculo, mientras que MOD()
utiliza FLOOR()
en su cálculo.
Sintaxis
La sintaxis es así:
REMAINDER(n2, n1)
Cada argumento puede ser cualquier tipo de dato numérico o cualquier tipo de dato no numérico que se pueda convertir implícitamente a un tipo de dato numérico.
Ejemplo
He aquí un ejemplo:
SELECT REMAINDER(100, 6)
FROM DUAL;
Resultado:
REMAINDER(100,6) ___________________ -2
REMAINDER()
vs MOD()
El resultado anterior puede parecer inesperado, especialmente cuando se compara con el MOD()
función. Pero esto se debe a que MOD()
usa el FLOOR()
función en su fórmula, mientras que REMAINDER()
usa el ROUND()
función.
Aquí están las dos funciones comparadas:
SELECT
REMAINDER(100, 6),
MOD(100, 6)
FROM DUAL;
Resultado:
REMAINDER(100,6) MOD(100,6) ___________________ _____________ -2 4
En este caso, obtenemos resultados muy diferentes de las dos funciones, aunque ambas devuelven el resto de su primer argumento dividido por su segundo.
¿Qué está pasando?
Quizás la forma más fácil de pensarlo es así:
SELECT
100/6,
ROUND(100/6) AS "ROUND()",
FLOOR(100/6) AS "FLOOR()"
FROM DUAL;
Resultado:
100/6 ROUND() FLOOR() ---------- ---------- ---------- 16.6666667 17 16
En este caso obtenemos un resultado diferente, dependiendo de si usamos ROUND()
o FLOOR()
.
- Si multiplicamos 17 por 6, obtenemos 102. Esto nos da un resto de -2.
- Si multiplicamos 16 por 6, obtenemos 96. Esto nos da un resto de 4.
Si cambiamos el 6
a un 7
, ambas funciones devuelven el mismo resultado:
SELECT
REMAINDER(100, 7),
MOD(100, 7)
FROM DUAL;
Resultado:
REMAINDER(100,7) MOD(100,7) ___________________ _____________ 2 2
Y esto es lo que ROUND()
y FLOOR()
volver:
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 no numéricos
Los argumentos pueden ser cualquier tipo de dato numérico o cualquier tipo de dato no numérico que se pueda convertir implícitamente a un tipo de dato numérico.
Aquí hay un ejemplo de lo que sucede cuando los argumentos no satisfacen ese criterio:
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()
devuelve null
si algún argumento es 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
De forma predeterminada, SQLcl y SQL*Plus devuelven un espacio en blanco cada vez que se produce un valor nulo como resultado de un SQL SELECT
declaración.
Sin embargo, puede usar SET NULL
para especificar una cadena diferente a devolver. Aquí especifiqué que la cadena null
debe ser devuelto.
Argumentos faltantes
Llamando a REMAINDER()
con el número incorrecto de argumentos, o sin ningún argumento da como resultado un error:
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:
Y:
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: