MOD() 函數 (SQL MOD() Function)
MOD() 函數用來計算兩數相除後的餘數(模數運算)。
語法
MOD(dividend, divisor)
-- 或使用 % 運算子
dividend % divisor
- dividend:被除數
- divisor:除數
各資料庫支援
| 資料庫 | MOD() | % 運算子 |
|---|---|---|
| MySQL | ✓ | ✓ |
| SQL Server | ✗ | ✓ |
| PostgreSQL | ✓ | ✓ |
| Oracle | ✓ | ✗ |
基本範例
-- MySQL / PostgreSQL / Oracle
SELECT MOD(10, 3);
-- 結果: 1(10 ÷ 3 = 3 餘 1)
SELECT MOD(20, 4);
-- 結果: 0(20 ÷ 4 = 5 餘 0)
SELECT MOD(7, 2);
-- 結果: 1(7 ÷ 2 = 3 餘 1)
-- SQL Server / MySQL / PostgreSQL(使用 % 運算子)
SELECT 10 % 3;
-- 結果: 1
實際應用範例
判斷奇偶數
-- 找出所有偶數 ID 的記錄
SELECT * FROM products WHERE MOD(id, 2) = 0;
-- 找出所有奇數 ID 的記錄
SELECT * FROM products WHERE MOD(id, 2) = 1;
-- SQL Server
SELECT * FROM products WHERE id % 2 = 0;
分組輪替(如交替換行顏色)
SELECT
id,
name,
CASE MOD(ROW_NUMBER() OVER (ORDER BY id), 2)
WHEN 0 THEN 'even'
WHEN 1 THEN 'odd'
END AS row_class
FROM products;
每 N 筆取一筆
-- 每 5 筆取 1 筆
SELECT * FROM products WHERE MOD(id, 5) = 0;
循環分配(如分配到不同伺服器)
-- 將訂單平均分配到 3 台伺服器
SELECT
order_id,
MOD(order_id, 3) + 1 AS server_id
FROM orders;
結果:order_id 1 → server 1, order_id 2 → server 2, order_id 3 → server 3, order_id 4 → server 1...
判斷是否為特定數的倍數
-- 找出數量是 12 的倍數的產品(如一打)
SELECT * FROM products WHERE MOD(quantity, 12) = 0;
-- 找出價格是 100 的倍數的產品
SELECT * FROM products WHERE MOD(price, 100) = 0;
搭配日期使用
-- 找出每月第一週的訂單(假設日期 1-7 號)
SELECT * FROM orders WHERE MOD(DAY(order_date), 7) BETWEEN 1 AND 7;
-- MySQL:找出星期一的訂單
SELECT * FROM orders WHERE MOD(DAYOFWEEK(order_date), 7) = 2;
注意事項
當除數為 0 時,MOD() 會產生錯誤。可以使用 NULLIF() 來避免:
SELECT MOD(10, NULLIF(divisor, 0)) FROM table_name;
-- 當 divisor 為 0 時,結果為 NULL 而非錯誤