判断字段“有值”需分层处理:先用IS NULL/IS NOT NULL安全判空,再依业务决定是否将空字符串、0等纳入“无值”;推荐COALESCE(NULLIF(TRIM(col), ''), default)统一处理NULL与空字符串。

SQL里怎么判断字段有没有值?别只盯着NULL
字段“没值”不等于NULL——它可能是空字符串''、数字0、或FALSE,具体得看业务含义。比如用户昵称为空字符串,和昵称字段为NULL,在展示层往往都要当“未填写”处理;但订单金额为0是合法状态,不能和NULL混为一谈。
所以判断逻辑要分两层:先看是否为NULL,再结合业务决定是否把空字符串、零等也纳入“无值”范围。
-
IS NULL和IS NOT NULL是唯一安全判断NULL的方式,= NULL或!= NULL永远返回UNKNOWN,结果为FALSE - 如果还要过滤空字符串:
column IS NOT NULL AND column != ''(MySQL)或NULLIF(column, '') IS NOT NULL(更通用) - 注意字符集和尾部空格:某些MySQL配置下
'a ' = 'a'可能为真,用TRIM()更稳妥
IFNULL()只在MySQL里管用,跨数据库得换写法
IFNULL(expr1, expr2)是MySQL特有函数,作用是:当expr1为NULL时返回expr2,否则返回expr1。但它**完全不处理空字符串或0**——这点常被忽略。
比如:SELECT IFNULL(nickname, '匿名用户') FROM users;,若nickname是'',结果仍是'',不是'匿名用户'。
- 想同时覆盖
NULL和空字符串:用COALESCE(NULLIF(TRIM(nickname), ''), '匿名用户') - PostgreSQL/SQL Server用
COALESCE(),Oracle用NVL()或COALESCE(),标准SQL推荐COALESCE() -
IFNULL()最多两个参数;COALESCE()支持多个,按顺序返回第一个非NULL值
数据展示时,别在SQL里硬塞默认值,除非真有必要
后端或前端渲染时做空值处理,通常比在SQL里用IFNULL或COALESCE更灵活。比如同一字段在列表页显示“-”,详情页显示“暂无”,SQL层没法区分上下文。
但如果必须由SQL统一兜底(如报表导出、视图封装、下游系统不处理空值),才考虑加默认值。
- 避免嵌套过深:
IFNULL(IFNULL(IFNULL(col, 'N/A'), ''), 'N/A')这种写法既难读又无效 - 数值型字段慎用字符串默认值:把
price设成IFNULL(price, 0)可以,但设成IFNULL(price, '未知')会导致隐式类型转换,可能报错或截断 - 日期字段用
NULL语义最清晰;强行用'1970-01-01'作默认值,容易和真实数据混淆
一个实际例子:用户列表头像URL字段的健壮写法
假设表中avatar_url字段类型为VARCHAR,可能为NULL、空字符串、或带协议的有效URL。前端需要一个“可用图片地址”,优先用原值,其次用默认头像。
SELECT id, name, COALESCE(NULLIF(TRIM(avatar_url), ''), 'https://example.com/default-avatar.png') AS avatar_url FROM users;
这里TRIM()防空白字符串,NULLIF(..., '')把空串转成NULL,再由COALESCE()统一兜底——三层处理缺一不可。换成IFNULL(avatar_url, '...')就漏掉了空字符串这个常见脏数据。
真正麻烦的从来不是语法,而是你不知道字段里到底混进了多少种“看起来像空”的值。

















