直接用mod(列名,2)可判断奇偶:0为偶数、1为奇数,但需注意负数和null问题;推荐abs(列名%2)=1判奇数,且务必加is not null过滤。

MOD函数在SQL中怎么判断奇偶性
直接用 MOD(列名, 2) 就能区分奇偶:结果为 0 是偶数,1 是奇数。注意不同数据库对负数的处理不一致,别默认它和编程语言一样。
不同数据库的MOD行为差异
PostgreSQL 和 SQL Server 没有 MOD() 函数,得换写法;MySQL、SQLite、Oracle 支持但对负数返回值不同。
- MySQL:
MOD(-5, 2)返回-1(不是1),所以不能只判断是否等于1,建议用ABS(MOD(列名, 2)) = 1 - PostgreSQL:用
%运算符,列名 % 2 = 0判断偶数,但-5 % 2得-1,同样要加ABS() - SQL Server:没有
MOD(),改用列名 % 2,负数结果也是负的,比如-5 % 2→-1
安全判断奇偶的通用写法
绕开负数陷阱,最稳的方式是统一转成非负余数再比较:
WHERE ABS(列名 % 2) = 1 -- 奇数<br>WHERE 列名 % 2 = 0 -- 偶数(仅当确认列名全为非负时可用)
如果字段可能为空,记得加 IS NOT NULL,否则 NULL % 2 结果还是 NULL,不会命中任何条件。
实际查询中容易漏掉的点
业务表里 ID 或计数类字段看似都是正整数,但导入异常数据、逻辑误算或迁移旧库时,真可能出现负值或 NULL。
- 别省略
WHERE 列名 IS NOT NULL,尤其在做分组统计时,NULL会直接消失,导致总数对不上 - 在 ORDER BY 里用
MOD()排序(比如交替高亮行)时,负数会导致顺序错乱,先ABS()再参与排序更可靠 - 某些 ORM(如 Django ORM)生成的 SQL 可能自动包裹字段,导致
MOD()作用对象变成表达式而非原始列,调试时看执行计划比猜更有效
真正麻烦的从来不是 MOD(列名, 2) 这五个字符,而是你没意识到数据里藏着负数或空值。











