SQL如何检测值变化(含与NULL之间的转换)
处理含NULL值的不等比较问题
在SQL里,!=或<>运算符遇到NULL时会返回UNKNOWN,导致无法正确判断“一个值是NULL、另一个不是”的不等场景。要覆盖所有val1和val2不等的情况(包括NULL与非NULL的转换),可以用以下两种方法:
方法一:使用标准SQL的IS DISTINCT FROM运算符
这是SQL标准里专门解决这类问题的运算符,它会将NULL视为相等的值,只要val1和val2的“状态”不同(值不等,或者一个是NULL一个不是),就会返回true。直接写:
WHERE val1 IS DISTINCT FROM val2
这个方法简洁且符合标准,大部分现代数据库(PostgreSQL、SQL Server、Oracle 12c+等)都支持。
方法二:手动组合条件(兼容不支持IS DISTINCT FROM的数据库)
如果你的数据库不支持上述运算符(比如老版本MySQL),可以手动把所有不等的场景列出来:
WHERE val1 != val2 OR (val1 IS NULL AND val2 IS NOT NULL) OR (val1 IS NOT NULL AND val2 IS NULL)
这个条件覆盖了三种需要返回true的情况:
- 两个非NULL值不相等
- val1是NULL但val2不是
- val2是NULL但val1不是
举几个例子验证:
- val1=3,val2=NULL → 第二个条件触发,返回true
- val1=NULL,val2=NULL → 三个条件都不满足,返回false(符合预期,两个NULL视为相等)
- val1=5,val2=5 → 无条件触发,返回false
- val1=2,val2=3 → 第一个条件触发,返回true
内容的提问来源于stack exchange,提问作者mmarion
相关产品推荐
相关产品推荐

