最常用写法是where字段is not null and字段!='',需同时排除null和空字符串;单用其一均会漏数据,trim()可防首尾空格干扰但影响索引性能。

WHERE 字段 IS NOT NULL AND 字段 != '' 最常用写法
这是最直观、兼容性最好的方式,适用于 MySQL、PostgreSQL、SQL Server(注意 SQL Server 中空字符串和 NULL 不等价)、SQLite 等主流数据库。关键在于必须同时排除两种“空值”:数据库层面的 NULL 和业务层面的空字符串 ''。
常见错误是只写 WHERE col != '' —— 这会漏掉所有 NULL 行,因为 NULL != '' 结果为 UNKNOWN,不被 WHERE 接受;反之,只写 WHERE col IS NOT NULL 会把 '' 当作有效数据返回。
-
IS NOT NULL判断的是缺失值,不是字符串比较,性能通常较好 -
!= ''在多数引擎中能走索引(如果该列有索引),但需注意字符集和排序规则影响(例如 MySQL 的utf8mb4_0900_as_cs区分大小写和空格) - PostgreSQL 中建议用
!= ''而非'',语义一致,但前者更通用
TRIM() 防止“看起来空”的干扰
用户输入或 ETL 流程常带首尾空格,' ' 或 '\t' 看似空,实则不是 ''。直接用 != '' 会漏判。此时需配合 TRIM()。
示例:WHERE TRIM(col) IS NOT NULL AND TRIM(col) != ''
- MySQL / PostgreSQL / SQL Server(2017+)都支持标准
TRIM()函数 - SQL Server 2016 及更早版本要用
RTRIM(LTRIM(col)) -
TRIM()本身对NULL返回NULL,所以TRIM(col) != ''自动过滤了原始NULL,但显式写IS NOT NULL更清晰、可读性更强 - 加
TRIM()后基本无法使用索引,大数据量时要注意性能
COALESCE 或 CASE 实现单条件简化(慎用)
有人想用 COALESCE(col, '') != '' 一行解决,逻辑上可行,但有隐患:
-
COALESCE(col, '')把NULL转成'',再判断是否等于'',结果是反的——你得到的是“为 NULL 或为空字符串”的行,得用!= ''才取反,容易绕晕 - 如果
col是TEXT或大对象类型,COALESCE可能触发隐式转换或截断(尤其在 SQL Server) - 可读性差,新人看不懂为什么用
COALESCE来“去空”,不如直写两个条件 - 真正适合简化场景是:字段可能为
NULL或空白字符串,且你想统一视作“无效”,比如WHERE COALESCE(TRIM(col), '') = ''判定无效值
MySQL 中的 NULL-safe 等号 不适用此场景
是 MySQL 特有运算符,用于安全比较 NULL(如 col NULL 返回 true/false 而非 UNKNOWN),但它不能帮你跳过空字符串。写 col '' 只匹配空字符串,不涉及 NULL 排除逻辑,和需求完全相反。
别被名字误导——“NULL-safe”只表示它能正确处理 NULL 参与的等值判断,不是“自动过滤 NULL”。此处必须分开处理。
真正容易被忽略的是:某些 ORM(如 Django ORM 的 __isnull=False + __exact='' 组合)或低代码平台生成的 SQL 可能默认不处理空格,上线后才发现数据异常。上线前务必用真实含空格、NULL、空字符串的样本验证查询结果。











