应同时使用IS NOT NULL和!= '',并配合TRIM()排除纯空白字符串,因NULL与空字符串本质不同,且!= ''对NULL无效;PostgreSQL等可选NULLIF(TRIM(col), '') IS NOT NULL。

在SQL中,要过滤出某个字段既不为 NULL 也不为空字符串('')的数据,需同时排除这两种情况。因为 NULL 和空字符串在SQL中是完全不同的值,且 = '' 或 != '' 对 NULL 无效(任何与 NULL 的比较结果都是 UNKNOWN),所以必须显式使用 IS NULL 或 IS NOT NULL 来判断。
基础写法:使用 IS NOT NULL 和 != ''
这是最常见、兼容性最好的方式,适用于 MySQL、PostgreSQL、SQL Server、Oracle 等主流数据库:
SELECT * FROM table_name WHERE column_name IS NOT NULL AND column_name != '';
-
注意:在某些数据库(如 PostgreSQL)中,若字段类型是
TEXT或含空白字符,可能还需考虑纯空白字符串(如' ')。此时仅!= ''不够,需进一步处理。 -
MySQL 小提示:如果字段是
CHAR类型,MySQL 会自动右补空格;比较时'a' = 'a '可能返回 true。建议用TRIM()避免歧义。
更严谨的写法:排除 NULL、空字符串和纯空白
当业务要求“有实际内容”时,应一并过滤掉只含空格、制表符等不可见字符的值:
SELECT * FROM table_name WHERE column_name IS NOT NULL AND TRIM(column_name) != '';
-
TRIM()在大多数数据库中默认去除首尾空格(包括空格、、等)。 - PostgreSQL 支持
TRIM(BOTH FROM column_name),MySQL 和 SQL Server 也支持简写TRIM(column_name)。 - 如果需兼容极老版本或特殊需求,可用
LENGTH(TRIM(column_name)) > 0替代!= ''。
不同数据库的注意事项
部分数据库对空字符串或 NULL 的处理略有差异:
-
Oracle:空字符串
''等价于NULL,所以WHERE col != ''实际已隐含排除了 NULL。但为清晰和可移植,仍建议显式写IS NOT NULL。 -
SQL Server:启用 ANSI_NULLS 时(默认开启),
col != ''不匹配 NULL;关闭后行为异常,不推荐关闭。 -
SQLite:支持
IS NOT NULL和!= '',但无原生TRIM()(3.25+ 版本支持,旧版可用LTRIM(RTRIM()))。
简化写法(部分数据库支持)
某些数据库提供更简洁的函数,例如:
- PostgreSQL:可用
NULLIF(TRIM(col), '') IS NOT NULL,等价于“去掉空格后不是空串且不为 NULL”。 - MySQL 8.0+:支持
column_name REGEXP '^\S+$'(匹配至少一个非空白字符),但性能通常不如TRIM+ 比较。 - 通用技巧:定义计算列或视图预处理,避免每次查询都重复写
TRIM。










