sql >> Base de Datos >  >> RDS >> Oracle

Función RESTANTE() en Oracle

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: