处理null用coalesce,过滤或转换空字符串用nullif;二者常配合使用,如coalesce(nullif(trim(col), ''), '默认值'),避免混淆语义。

SQL视图里用 COALESCE 还是 NULLIF?先看场景再选
直接说结论:处理 NULL 用 COALESCE,过滤或转换空字符串用 NULLIF。两者常配合使用,但混用容易出错——比如 COALESCE(col, '') 会让原本的 NULL 变成空字符串,反而更难判断真实缺失。
典型场景:user_profile 视图中 nickname 字段可能为 NULL 或 '',前端要统一显示“未设置”。这时不能只写 COALESCE(nickname, '未设置'),因为 '' 会被原样保留。
正确做法是先清空空字符串,再补默认值:
COALESCE(NULLIF(TRIM(nickname), ''), '未设置')
-
TRIM()防止前后空格干扰判断 -
NULLIF(..., '')把空字符串转成NULL -
COALESCE统一兜底
WHERE 条件里怎么安全地过滤空值和空字符串
写 WHERE col != '' AND col IS NOT NULL 看似稳妥,但有隐患:如果字段是 TEXT 类型且含不可见字符(如 \u00A0、换行符),它既不是 NULL 也不是 '',却仍应视为“空”。
更鲁棒的写法是:
WHERE NULLIF(TRIM(col), '') IS NOT NULL
-
TRIM去掉首尾空白(包括制表符、换行) -
NULLIF(..., '')把结果为空字符串的转成NULL -
IS NOT NULL判断是否真有有效内容 - 比
LENGTH(TRIM(col)) > 0更兼容不同数据库(PostgreSQL/MySQL/SQL Server 都支持NULLIF)
视图定义里别用 CASE WHEN 处理简单空值转换
有人习惯在视图里写一大段 CASE WHEN col IS NULL THEN ... WHEN col = '' THEN ... ELSE ... END。逻辑没错,但可读性差、维护成本高,还容易漏掉 TRIM 或大小写变体(比如 ' ')。
推荐用组合函数替代:
COALESCE(NULLIF(TRIM(UPPER(col)), ''), 'N/A')
- 所有清洗动作链式调用,顺序清晰
- 避免嵌套过深,也方便后续加条件(比如再套个
LEFT(col, 20)截断) - 注意
UPPER和TRIM的执行顺序:先TRIM再UPPER,否则空格可能被误判
MySQL 和 PostgreSQL 在空字符串处理上的关键差异
MySQL 默认开启 STRICT_TRANS_TABLES 之前,空字符串插入到 NOT NULL 的 VARCHAR 字段会静默转成 NULL;而 PostgreSQL 严格区分 NULL 和 '',哪怕字段允许 NULL,'' 也会原样存入。
这意味着跨数据库写视图时,不能假设 col = '' 等价于 col IS NULL。必须显式处理:
- 在 MySQL 上,若业务逻辑要求空字符串和
NULL同等对待,视图里一律用NULLIF(col, '')归一化 - 在 PostgreSQL 上,
''永远不会自动变成NULL,所以漏掉NULLIF就会导致数据不一致 - 如果视图要同时支持两者,优先按 PostgreSQL 语义设计(即把
''显式转NULL),再在 MySQL 侧验证行为是否收敛
真正麻烦的不是语法,而是团队对“空”的定义是否统一——比如客服系统里 '' 表示用户删了昵称,NULL 表示从未填写,这种业务语义必须在视图注释里写清楚,不能只靠函数掩盖。










