$ 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
| a | b | c | zero_ijou |
|---|---|---|---|
| 1 | -1 | 1 | 2 |
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_id | name | amari | guusuu_kisuu |
|---|---|---|---|
| 1 | 鈴木 | 1 | 奇数 |
| 2 | 佐藤 | 0 | 偶数 |
| 3 | 田中 | 1 | 奇数 |
| 4 | 中村 | 0 | 偶数 |
| 5 | 小林 | 1 | 奇数 |
| 6 | 加藤 | 0 | 偶数 |
| 7 | 吉田 | 1 | 奇数 |
| 8 | 山田 | 0 | 偶数 |
18 行(うち 8 行を表示)
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 を渡せば小数の余りも求められます。
次に読む
使い方を順に読むなら
関係する関数
根拠にした一次情報
- PostgreSQL 18 マニュアル: 数学関数と演算子(2026-09-02 確認)