MySQL支持MOD(a,b)和%且b=0时返回NULL,PostgreSQL的MOD(a,b)在b=0时报错,Oracle支持MOD()函数而SQL Server仅支持%且不识别MOD(),跨库应优先用%并加b!=0判断。
MySQL和PostgreSQL都支持MOD()函数,但参数顺序和NULL处理逻辑不同。MySQL中MOD(a, b)等价于a % b,当b为0时返回NULL;PostgreSQL的MOD(a, b)在b = 0时直接报错division by zero。如果写跨数据库兼容的SQL,建议优先用%操作符(二者均支持),并显式加WHERE b != 0判断。
Oracle用MOD(a, b)函数,但SQL Server只认%操作符,没有MOD()函数。在SQL Server里写MOD(10, 3)会报错Invalid column name 'MOD'。正确写法是10 % 3。注意:SQL Server中负数取模结果符号跟随被除数(如-7 % 3 = -1),而MySQL/PostgreSQL中符号跟随除数(-7 % 3 = 2)。
常见需求:限制OFFSET必须是每页大小的整数倍,避免前端传错值导致数据错位。比如每页10条,允许的offset只能是0、10、20……可用MOD()做校验:
SELECT * FROM orders WHERE MOD(:offset, 10) = 0 LIMIT 10 OFFSET :offset;
实际执行前应先检查MOD(:offset, 10)是否为0,否则跳过查询或报错。注意:offset需为非负整数,且MOD(-5, 10)在不同数据库结果不一致,务必提前过滤负值。
MOD()对浮点数支持不稳定:MySQL允许MOD(5.7, 2.1)但结果精度不可靠;PostgreSQL要求两参数均为整数类型,否则报错function mod(double precision, double precision) does not exist。负数场景更要小心:
MOD(-8, 3)在MySQL返回1,在PostgreSQL也返回1,但在SQL Server用%返回-2ABS()转正再取模,再根据原始符号修正结果CAST(x AS BIGINT)再运算