Oracle SQL 関数 : MOD : 剰余演算


 numberRet := MOD( number1 , number2 );

  MODは number1 を number2 で割った余りを戻します。 number2 が0の場合は number1 を返します。
  
  numberRet の値は、数値の優先順位が最も高い引数を判断し、
  残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
以下に簡単な例を示します。(「11」を「4」で割った時の余りの計算です。)
SQL> SELECT MOD(11, 4) FROM DUAL;

 MOD(11,4)
----------
         3
以下に、被除数が負値の場合や、除数が負値の場合、及び実数での「MOD」の結果を示します。
SQL> SELECT
  2      MOD( 11,  0)  AS "ZERO除算"
  3     ,MOD(-11,  4)  AS "被除数が負"
  4     ,MOD( 11, -4)  AS "除数が負"
  5     ,MOD(-11, -4)  AS "共に負"
  6     ,MOD( 11.1, 4) AS "被除数が実数"
  7     ,MOD( 11, 4.1) AS "除数が実数"
  8  FROM DUAL;

  ZERO除算 被除数が負   除数が負     共に負 被除数が実数 除数が実数
---------- ---------- ---------- ---------- ------------ ----------
        11         -3          3         -3          3.1        2.8

MOD 関数の戻り値の符号は、被除数の符号と同じになります。これは通常の除算の余りの計算と一緒だと思います。

尚、MOD 関数の計算は以下の計算式と結果が同じになります。

 numberRet := number1 - number2 * TRUNC(number1 / number2)

先ほどの MOD 関数を置き換えてみます。
SQL> SELECT
  2      (-11) - ( 4) * TRUNC((-11) / ( 4))    AS "被除数が負"
  3     ,( 11) - (-4) * TRUNC(( 11) / (-4))    AS "除数が負"
  4     ,(-11) - (-4) * TRUNC((-11) / (-4))    AS "共に負"
  5     ,( 11.1) - ( 4) * TRUNC(( 11.1) / (4)) AS "被除数が実数"
  6     ,( 11) - (4.1) * TRUNC((11) / (4.1))   AS "除数が実数"
  7  FROM DUAL;

被除数が負   除数が負     共に負 被除数が実数 除数が実数
---------- ---------- ---------- ------------ ----------
        -3          3         -3          3.1        2.8