concat是sql中常用字符串拼接函数,但各数据库对空值处理和语法支持存在差异:mysql 5.7+将null视为空字符串,而postgresql、sql server等遇null即返回null;跨库建议用||或coalesce兜底。

CONCAT 是 SQL 中最常用、最直观的字符串拼接函数,但不同数据库对它的支持和行为有明显差异。掌握它的基本用法和常见陷阱,能避免空值导致结果为 NULL、兼容性问题等实际开发中的坑。
基础用法:连接多个非空字符串
标准写法是 CONCAT(str1, str2, ..., strN),按顺序把所有参数连成一个字符串。例如:
- MySQL:
SELECT CONCAT('Hello', ' ', 'World');→ 返回'Hello World' - PostgreSQL(需启用
pg_trgm或使用||,原生不支持 CONCAT,但 9.1+ 已内置) - SQL Server 2012+ 和 Oracle 12c+ 也支持标准 CONCAT,但早期版本需用
+或||
空值(NULL)处理:最容易踩的坑
多数数据库中,只要任意一个参数为 NULL,CONCAT 结果就为 NULL(MySQL 5.7+ 是例外,会把 NULL 当作空字符串处理)。例如:
- MySQL 8.0:
CONCAT('a', NULL, 'b')→'ab' - PostgreSQL / SQL Server:
CONCAT('a', NULL, 'b')→NULL - 安全写法(通用):
CONCAT(COALESCE(col1, ''), COALESCE(col2, ''))
替代方案与跨库兼容技巧
如果需要兼容老版本或多种数据库,建议优先考虑更稳定的拼接方式:
- 使用双竖线:
col1 || ' ' || col2(PostgreSQL、Oracle、SQL Server 2012+ 支持) - SQL Server 可用加号:
col1 + ' ' + col2(注意:任一列为 NULL 时整条结果为 NULL) - MySQL 中可搭配 IFNULL 或 COALESCE 做兜底:
CONCAT(IFNULL(name, ''), '(', IFNULL(phone, ''), ')')
实用场景:生成带格式的业务字段
常用于构造展示用字段,比如用户全名、地址组合、日志摘要等:
- 拼接姓名(容忍中间名为空):
CONCAT(last_name, ', ', first_name, COALESCE(CONCAT(' ', middle_name), '')) - 生成邮箱前缀提示:
CONCAT(LEFT(email, 2), '***', SUBSTRING_INDEX(email, '@', -1))(MySQL 示例) - 构造 URL 片段:
CONCAT('/user/', id, '-', REPLACE(name, ' ', '-'))










