mod()函数仅返回余数,mod(x,2)=0为偶数、=1为奇数,但只判断数值x本身奇偶性而非行号;负数结果因数据库而异,浮点数、null、字符串需先转换;%运算符更通用,&位运算仅适用于非负整数。

MOD() 函数本身不“判断”奇偶,它只返回余数;真正起作用的是你用 MOD(x, 2) 的结果值:等于 0 就是偶数,等于 1 就是奇数。这是最直接、最通用的逻辑,但必须注意——它判断的是 **x 这个数值本身的奇偶性**,不是“第几行”的奇偶。
MOD(x, 2) 返回值含义必须记牢
MOD(x, 2) 的结果只能是 0 或 1(当 x 是整数时)。别误以为 MOD(7, 2) 返回 3.5 或其他值——它永远是整数余数。
-
MOD(4, 2)→0:4 是偶数 -
MOD(9, 2)→1:9 是奇数 -
MOD(-3, 2)在 MySQL 中返回1,在 PostgreSQL 中返回-1——负数行为不一致,**避免对负数用 MOD 判断奇偶**
别把“id 是奇数”和“第奇数行”混为一谈
写 WHERE MOD(id, 2) = 1 筛出来的是 id 值为奇数的记录,和查询结果的行序无关。如果表里删过数据、id 不连续、或插入乱序,这些记录在结果集中根本不会按 1-3-5… 排列。
- 真要取“结果集里的第 1、3、5 行”,必须先用
ROW_NUMBER() OVER (ORDER BY ...)生成稳定行号,再套MOD(rn, 2) = 1 -
ORDER BY必须明确且唯一,否则ROW_NUMBER()分配的序号可能每次执行都变 - MySQL 8.0+、PostgreSQL、SQL Server、Oracle 都支持;SQLite 3.25+ 也支持,但旧版不支持窗口函数
替代写法:% 和 & 各有适用场景
% 运算符和 MOD() 功能等价,但语法更短,且跨数据库兼容性更好(MySQL、PostgreSQL、SQL Server 都支持);&(按位与)性能略优,但可读性差,且只适用于非负整数。
- 用
id % 2 = 1和MOD(id, 2) = 1效果一样,前者更常见 -
id & 1 = 1可以快速判奇,但id为负数时行为依赖数据库实现,不推荐用于业务逻辑 - 正则表达式(如
id REGEXP '[13579]$')纯属炫技,慢、不可索引、易出错,仅限字符串字段且无更好选择时临时用
MOD('123', 2) 在 MySQL 中能运行(转成 123),但在 PostgreSQL 中直接报错。遇到不确定类型的数据,先用 CAST 或 COALESCE 处理干净再取模。










