SQL筛选状态变更行时old!=new忽略NULL值问题如何解决
问题原因
你当前查询无法匹配old为NULL的变更记录,是因为SQL中NULL与任意值进行!=、=这类常规比较运算时,返回结果都为未知,不会被WHERE条件判定为真,所以初始状态从NULL转为其他值的记录全部被漏掉了。
解决方案
方案1(适配支持标准SQL的数据库)
PostgreSQL、SQL Server 2022+、MySQL 8.0.20+等主流数据库都支持IS DISTINCT FROM运算符,专门用于处理包含NULL的等值/不等值判断,写法更简洁:
SELECT id, name, old, new, `timestamp` FROM tablex WHERE id = 12342 AND old IS DISTINCT FROM new ORDER BY `timestamp` ASC;
方案2(兼容所有数据库版本)
如果你的数据库不支持上述运算符,可以手动补全NULL的判断逻辑,覆盖所有状态变更场景:
SELECT id, name, old, new, `timestamp` FROM tablex WHERE id = 12342 AND ( old != new OR (old IS NULL AND new IS NOT NULL) OR (old IS NOT NULL AND new IS NULL) ) ORDER BY `timestamp` ASC;
效果说明
上述两种写法都可以正确过滤old和new完全一致的冗余行,同时保留所有状态变更记录:包括NULL转非空、非空转NULL、非空值之间变更的所有场景。
内容的提问来源于stack exchange,提问作者ManojN
相关产品推荐
相关产品推荐

