MySQL的CONCAT函数拼接多列时,任一参数为NULL则结果为NULL;PostgreSQL 9.1+和SQL Server 2012+虽支持CONCAT,但NULL处理逻辑不同,跨数据库应优先用COALESCE加连接符保障兼容性。

CONCAT函数在MySQL中能直接拼接多列,但其他数据库可能不支持或行为不同
MySQL 5.0.15+ 的 CONCAT 支持任意数量参数,比如 CONCAT(first_name, ' ', last_name);但 PostgreSQL 没有原生 CONCAT 函数(需用 || 或 CONCAT() 从 9.1+ 才引入,且对 NULL 处理更严格);SQL Server 2012+ 才提供 CONCAT,且会自动把 NULL 转为空字符串——这点和 MySQL 截然不同。
实际写法前务必确认数据库类型和版本,否则执行报错或结果异常。
MySQL里用CONCAT拼接多列时,NULL会让整条结果变NULL
这是最常踩的坑:只要任一参数是 NULL,CONCAT 返回 NULL,不是跳过或转空串。
- 错误写法:
CONCAT(name, '-', phone)→ 若phone为NULL,整列全空 - 安全写法:
CONCAT(IFNULL(name, ''), '-', IFNULL(phone, '')) - 更简洁替代:
CONCAT(COALESCE(name, ''), '-', COALESCE(phone, ''))
注意 IFNULL 是 MySQL 特有,COALESCE 是标准 SQL,兼容性更好。
SQL Server的CONCAT自动处理NULL,但不接受非字符串类型
SQL Server 的 CONCAT 会把 NULL 当作空字符串,省去显式判空,但要求所有参数能隐式转为字符串——遇到 INT、DATETIME 通常没问题,但自定义类型或某些二进制字段会报错。
- 可行:
CONCAT(first_name, ' ', age)→age自动转字符串 - 报错:
CONCAT(first_name, some_varbinary_col)→ 需先CONVERT(VARCHAR, some_varbinary_col) - 注意:
+运算符不自动处理NULL,且要求显式转类型,比CONCAT更易出错
跨数据库可移植的拼接方案:优先用标准COALESCE + 连接符
如果要写一次代码跑多个数据库(比如应用同时支持 MySQL 和 PostgreSQL),别依赖 CONCAT,改用标准 SQL 的 COALESCE 加连接操作符:
SELECT COALESCE(first_name, '') || ' ' || COALESCE(last_name, '') AS full_name FROM users;
PostgreSQL 用 ||,MySQL 8.0+ 也支持;SQL Server 不支持 ||(得用 +),所以真正跨库时,最稳的方式其实是 ORM 层抽象或条件化 SQL。硬写纯 SQL 时,宁可按数据库分文件,也别强塞一个“看似通用”的写法——表面省事,实则埋雷。
真正麻烦的从来不是怎么拼,而是 NULL 怎么兜底、类型怎么对齐、还有开发环境和生产环境用的数据库版本是否真的一致。

















