NULL 与三值逻辑为什么容易出错
NULL 不是空字符串,和 NULL 比较可能得到 UNKNOWN。
问题与判断方法
SQL 条件不仅有 TRUE 和 FALSE,还可能得到 UNKNOWN。NULL 表示未知或缺失,因此 status = NULL 不会找到空值行,NOT 也不能把 UNKNOWN 自动变成 TRUE。
筛选空值使用 IS NULL 或 IS NOT NULL;展示备用值使用 COALESCE。COUNT(*)、COUNT(字段)、SUM 和 AVG 对 NULL 的处理也不同,统计前要明确分母和缺失值含义。
不要把所有 NULL 都替换成 0 或空字符串。未知金额、零金额和未填写文本往往代表不同业务状态,替代值应由业务规则决定。
示例
示例数据表
表名:
customers| id | nickname |
|---|---|
| 101 | NULL |
| 102 | Bobby |
| 103 | NULL |
优化前 / 不推荐
SELECT id, nickname FROM customers WHERE nickname = NULL ORDER BY id;优化前运行结果
| id | nickname |
|---|
优化后 / 推荐
SELECT id, nickname FROM customers WHERE nickname IS NULL ORDER BY id;优化后运行结果
| id | nickname |
|---|---|
| 101 | NULL |
| 103 | NULL |
为什么这样更好:等号比较 NULL 不会得到 TRUE;IS NULL 才会返回缺少昵称的客户。
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。