コマンド道場

$ man mod

MOD / %

数値関数

割った余りを返す。負の数のときの符号が数学の定義と違う。

呼び出しの形

MOD(割られる数, 割る数)
割られる数 % 割る数

つまずきやすいところ

  • 負の数では符号が割られる数に従います。 MOD(-7, 3) は -1 で、数学の剰余(2)ではありません。0 以上にしたいなら MOD(MOD(a, n) + n, n) と書きます。

  • 0 で割るとエラーです。NULLIF(割る数, 0) で避けられます。

  • % は PostgreSQL や MySQL では使えますが、Oracle には無く MOD だけです。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

負の数での符号を確かめる
SELECT MOD(7, 3) AS a, MOD(-7, 3) AS b, MOD(7, -3) AS c, MOD(MOD(-7, 3) + 3, 3) AS zero_ijou
abczero_ijou
1-112

1

MOD(-7, 3) は -1 です。0 以上にしたいときは、もう一度足してから割ります。

偶数・奇数を判定する
SELECT shain_id, name, MOD(shain_id, 2) AS amari, CASE WHEN MOD(shain_id, 2) = 0 THEN '偶数' ELSE '奇数' END AS guusuu_kisuu FROM shain ORDER BY shain_id
shain_idnameamariguusuu_kisuu
1鈴木1奇数
2佐藤0偶数
3田中1奇数
4中村0偶数
5小林1奇数
6加藤0偶数
7吉田1奇数
8山田0偶数

18(うち 8 行を表示)

0 で割るとエラーになる
SELECT MOD(7, 0)

実行するとこうなります

ERROR: division by zero

割る数が 0 になりうるなら NULLIF を挟んでください。

説明

MOD は割った余りを返します。% 演算子も同じ意味です。偶数・奇数の判定や、n 件ごとの区切りに使います。

⚠️ 負の数のときの符号に注意してください。SQL の MOD割られる数の符号を引き継ぎます。MOD(-7, 3)-1 で、数学でいう剰余(0 以上になる 2)ではありません。「必ず 0 以上にしたい」なら MOD(MOD(a, n) + n, n) と書きます。

⚠️ 0 で割るとエラーになります。割る数が 0 になりうるなら、NULLIF(割る数, 0) を挟んでください。

整数どうしなら結果も整数です。numeric を渡せば小数の余りも求められます。

次に読む

使い方を順に読むなら

関係する関数

根拠にした一次情報