sql >> Databasteknik >  >> RDS >> Oracle

REMAINDER() Funktion i Oracle

I Oracle, REMAINDER() funktion returnerar resten av dess första argument dividerat med dess andra.

Det liknar MOD() funktion, förutom att den använder ROUND() i sin beräkning, medan MOD() använder FLOOR() i sin beräkning.

Syntax

Syntaxen ser ut så här:

REMAINDER(n2, n1)

Varje argument kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.

Exempel

Här är ett exempel:

SELECT REMAINDER(100, 6)
FROM DUAL;

Resultat:

   REMAINDER(100,6) 
___________________ 
                 -2 

REMAINDER() kontra MOD()

Ovanstående resultat kan tyckas vara oväntat, speciellt i jämförelse med MOD() fungera. Men detta beror på att MOD() använder FLOOR() funktion i sin formel, medan REMAINDER() använder ROUND() fungera.

Här är de två funktionerna som jämförs:

SELECT 
    REMAINDER(100, 6),
    MOD(100, 6)
FROM DUAL;

Resultat:

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

I det här fallet får vi väldigt olika resultat från de två funktionerna, även om de båda returnerar resten av dess första argument dividerat med dess andra.

Vad händer?

Det kanske enklaste sättet att tänka på det är så här:

SELECT 
    100/6,
    ROUND(100/6) AS "ROUND()",
    FLOOR(100/6) AS "FLOOR()"
FROM DUAL;

Resultat:

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

I det här fallet får vi ett annat resultat, beroende på om vi använder ROUND() eller FLOOR() .

  • Om vi ​​multiplicerar 17 med 6 får vi 102. Detta ger oss en återstod på -2.
  • Om vi ​​multiplicerar 16 med 6 får vi 96. Detta ger oss en återstod av 4.

Om vi ​​ändrar 6 till en 7 , ger båda funktionerna samma resultat:

SELECT 
    REMAINDER(100, 7),
    MOD(100, 7)
FROM DUAL;

Resultat:

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

Och här är vad ROUND() och FLOOR() returnera:

SELECT 
    100/7,
    ROUND(100/7) AS "ROUND()",
    FLOOR(100/7) AS "FLOOR()"
FROM DUAL;

Resultat:

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

Icke-numeriska argument

Argumenten kan vara vilken numerisk datatyp som helst eller vilken icke-numerisk datatyp som helst som implicit kan konverteras till en numerisk datatyp.

Här är ett exempel på vad som händer när argumenten inte uppfyller dessa kriterier:

SELECT REMAINDER('Ponzi', 'Invest')
FROM DUAL;

Resultat:

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

Nollargument

REMAINDER() returnerar null om något argument är null :

SET NULL 'null';

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

Resultat:

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

Som standard returnerar SQLcl och SQL*Plus ett tomt utrymme när ett nollvärde inträffar som ett resultat av en SQL SELECT påstående.

Du kan dock använda SET NULL för att ange en annan sträng som ska returneras. Här specificerade jag att strängen null bör returneras.

Argument saknas

Anropar REMAINDER() med fel antal argument, eller utan några argument resulterar i ett fel:

SELECT REMAINDER()
FROM DUAL;

Resultat:

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:

Och:

SELECT REMAINDER(10, 2, 3)
FROM DUAL;

Resultat:

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:

  1. Använda ett IF-uttalande i en MySQL SELECT-fråga

  2. Hur man väljer ett visst antal tecken från vänster eller höger om en sträng i SQL Server

  3. 2 sätt att kontrollera om dataåtkomst är aktiverad i SQL Server (T-SQL-exempel)

  4. Hur får man ett datum i formatet ÅÅÅÅ-MM-DD från ett TSQL-datumtidfält?