SQL NULL 值完整判断规则(全数据库通用:MySQL、SQLServer、Oracle)
一、核心底层规则:三值逻辑
SQL 存在三种结果:TRUE / FALSE / UNKNOWN NULL = 未知,任何运算符和 NULL 对比结果都是 UNKNOWN,WHERE 只接收 TRUE
NULL = 任意值→ UNKNOWN(查不到)NULL != 任意值→ UNKNOWN(查不到)NULL > / < / LIKE 任意值→ UNKNOWN(查不到)
sql
-- 1. 错误:永远查不出 NULL 数据
WHERE LR_ZHLX != NULL
WHERE LR_ZHLX = NULL
-- 2. 正确判断空值,专用语法
WHERE LR_ZHLX IS NULL -- 匹配字段为空的数据
WHERE LR_ZHLX IS NOT NULL-- 匹配字段有值的数据
二、NULL 与空字符串 '' 的区别
- MySQL:区分
NULL和'''' != 'EBZH'→ TRUE,可以正常查到NULL != 'EBZH'→ UNKNOWN 过滤
- Oracle:空字符串
''等同于 NULL,两者无区别 - SQLServer:区分
NULL和''
三、函数处理 NULL(规避判断麻烦)
用 IFNULL/COALESCE 把 NULL 替换成默认值,统一判断
MySQL
sql
WHERE IFNULL(LR_ZHLX,'') != 'EBZH'
SQL Server
sql
WHERE ISNULL(LR_ZHLX,'') != 'EBZH'
Oracle
sql
WHERE NVL(LR_ZHLX,'') != 'EBZH'
逻辑:NULL 转空字符串,再对比,不用写 OR IS NULL
四、索引优化提示
WHERE A IS NULL OR A != 'XX' 大概率不走单列索引 大数据量表推荐 UNION ALL 拆分,分别走索引:
sql
-- 第一部分:非EBZH有值数据
SELECT djbh,SPDM,je FROM IPOS_QTLSDMX WHERE LR_ZHLX != 'EBZH'
UNION ALL
-- 第二部分:NULL数据
SELECT djbh,SPDM,je FROM IPOS_QTLSDMX WHERE LR_ZHLX IS NULL;
五、高频易错总结
- 判断空值只能用
IS NULL / IS NOT NULL,=NULL、!=NULL全部失效 !=、<>不会匹配 NULL,需要手动拼接OR IS NULLNOT IN列表中如果存在 NULL,整条查询无数据NOT 字段='xxx'自动兼容 NULL,代码更简洁- 分不清 NULL 和空串时,用
IFNULL/ISNULL/NVL转换后再判断