关于mysql下null的一个小细节
- 有如下部分sql语句:
ero.statusId IS NULL OR ero.statusId != 0 - 问题
如果 ero.statusId != 0 为什么不能判断 null - 分析: 这是 SQL 中关于
NULL的一个重要特性:
NULL 比较的特殊性:
在 SQL 中,NULL 不等于任何值,包括它自己, 因为 NULL 不是一个「值」,而是「没有值」。所以:
NULL != 0的结果是UNKNOWN(未知),不是TRUENULL = 0的结果也是UNKNOWN,不是FALSE
因此,当 ero.statusId 为 NULL 时:
ero.statusId != 0不会匹配这条记录(因为结果是 UNKNOWN)- 这样没有订单的 ticket 就被过滤掉了
解决办法:
必须显式检查 NULL:ero.statusId IS NULL OR ero.statusId != 0
ero.statusId IS NULL→ 匹配没有订单的 ticket ✓ero.statusId != 0→ 匹配有订单但状态不是0的记录 ✓
这样两种情况都被覆盖了。
简单来说:SQL 中比较 NULL 时,不能用 = 或 !=,必须用 IS NULL 或 IS NOT NULL。
