mysql中concat拼接遇null返回null,需用ifnull或coalesce预处理;postgresql用||需配合coalesce;sql server用+号更敏感,须用isnull或coalesce;新版数据库支持标准concat()可自动忽略null。

MySQL里用CONCAT拼接字段,空值会让整条结果变NULL
直接用 CONCAT() 拼接多个字段时,只要其中任意一个字段是 NULL,整个结果就变成 NULL——这在生成展示文本时非常容易踩坑,比如 CONCAT(first_name, ' ', last_name) 遇到 last_name 为空就啥也看不到。
解决方法是把可能为空的字段先用 IFNULL() 或 COALESCE() 替换为默认值:
CONCAT(IFNULL(first_name, ''), ' ', IFNULL(last_name, ''))CONCAT(COALESCE(first_name, ''), ' ', COALESCE(last_name, ''))- 如果想让空字段显示成“未知”,可写成
COALESCE(first_name, '未知')
PostgreSQL要用||操作符,但同样要处理NULL
PostgreSQL不支持 CONCAT()(9.6之前没有,新版虽有但行为和MySQL不同),惯用写法是用双竖线 || 拼接,比如 first_name || ' ' || last_name。但问题一样:任一字段为 NULL,整个表达式结果就是 NULL。
必须显式转换空值:
- 用
COALESCE(first_name, '') || ' ' || COALESCE(last_name, '') - 也可以封装成函数复用:
COALESCE(first_name, '') || COALESCE(' ' || last_name, '')(注意后半段要整体包裹,避免空格前导) - 若字段含数字类型(如
age),需先转字符串:COALESCE(first_name, '') || ' (' || COALESCE(age::text, '') || ')'
SQL Server的+号拼接对NULL更敏感
SQL Server用加号 + 做字符串拼接,但它的NULL传播更严格:哪怕只有一侧是 NULL,结果就是 NULL,而且如果任意字段是数值型,还可能触发类型转换错误。
稳妥做法是统一用 ISNULL() 或 COALESCE() 处理:
ISNULL(first_name, '') + ' ' + ISNULL(last_name, '')COALESCE(first_name, '') + ' ' + COALESCE(last_name, '')- 遇到日期或数字字段,必须显式转换:
ISNULL(first_name, '') + ' - ' + ISNULL(CAST(birth_date AS VARCHAR), '')
跨数据库兼容写法:优先考虑CONCAT()但注意版本
MySQL 5.7+、PostgreSQL 9.6+、SQL Server 2012+ 都支持标准 CONCAT() 函数,它天生忽略 NULL 参数(即 CONCAT('a', NULL, 'b') 返回 'ab'),比手动处理空值省事得多。
但要注意:
- MySQL 5.6 及更早版本不支持
CONCAT()的NULL跳过逻辑(它仍返回NULL) - SQLite 没有
CONCAT(),只能用||加IFNULL() - Oracle 用
CONCAT()但只接受两个参数,多字段得嵌套:CONCAT(CONCAT(a,b),c),不如直接用||
实际项目里,如果确定数据库版本够新,CONCAT() 是最简洁的选择;否则老老实实用 COALESCE() + 拼接操作符,别图省事漏掉空值判断。











