concat函数用于按序拼接多个字符串,mysql中任一null致结果为null,sql server/postgresql则忽略null;多参数拼接推荐concat_ws(自动跳过null且支持分隔符);需注意隐式转换、索引失效及跨行聚合应选用group_concat或string_agg。

SQL中的CONCAT函数是拼接字符串最直接的工具,核心作用是把多个字符串值按顺序合并成一个新字符串。它在MySQL、PostgreSQL、SQL Server等主流数据库中都支持,但行为细节有差异,使用时需注意。
CONCAT基本用法与参数规则
语法为 CONCAT(str1, str2, ...),支持两个或更多参数,可以是字段名、字面量、表达式甚至数字或日期(数据库会自动转为字符串)。
- MySQL中:若任一参数为
NULL,整个结果返回NULL;例如CONCAT('a', NULL, 'c')→NULL - SQL Server和PostgreSQL中:
NULL被视为空字符串处理;CONCAT('a', NULL, 'c')→'ac' - Oracle例外:只支持两个参数,多字段拼接需嵌套,如
CONCAT(CONCAT(col1, col2), col3)
带分隔符的拼接:CONCAT_WS更实用
当需要统一加逗号、竖线或空格等分隔符时,CONCAT_WS(separator, str1, str2, ...)比反复写CONCAT更简洁可靠。
- 第一个参数是分隔符,后续才是待拼接内容
- 分隔符本身为
NULL时,整条语句返回NULL - 但参数中的
NULL会被自动跳过,不产生多余分隔符;例如CONCAT_WS(',','A',NULL,'C')→'A,C' - 适合生成报表字段、导出CSV格式数据等场景
常见搭配与避坑要点
实际写SQL时,CONCAT常与其他函数配合使用,也容易踩几个典型坑:
- 数字字段直接拼接可能触发二进制隐式转换(MySQL),导致乱码或警告;建议显式转类型:
CONCAT(CAST(age AS CHAR), '岁') - 想在拼接前后加括号、引号等符号,记得用单引号包裹,如
CONCAT('(', tel, ')') - 和
WHERE条件结合时,注意避免全表扫描;例如WHERE name LIKE CONCAT('%', @keyword, '%')虽然可行,但不如全文索引或前缀匹配高效 - 若需对分组后多行数据拼接(如“一人多角色”),应改用
GROUP_CONCAT(MySQL)或STRING_AGG(PostgreSQL/SQL Server),CONCAT无法跨行工作
替代方案与兼容性提示
不是所有环境都支持CONCAT,可考虑这些等效写法:
- SQL Server:可用
+运算符,如first_name + ' ' + last_name;但任一操作数为NULL时结果为NULL,不如CONCAT鲁棒 - PostgreSQL:支持标准
||操作符,如first_name || ' ' || last_name - 老版本MySQL(CONCAT多参数,只能嵌套或改用
CONCAT_WS










