在SQL查询场景中,字段合并是非常常见的需求,比如需要将用户的姓和名拼接成完整姓名,或者把同一分组下的多条备注信息合并成一条展示。不同数据库厂商提供的字符串连接函数各有不同,下面我们就来详细介绍各类数据库中的字段合并方法。

通用基础拼接方式
部分数据库支持使用加号或者双竖线作为字符串连接运算符,不过这种方式兼容性较差,不同数据库的支持情况不同。
使用加号拼接
SQL Server支持使用+运算符拼接字符串,示例代码如下:
-- SQL Server中使用+拼接字段 SELECT '姓:' + last_name + ',名:' + first_name AS full_name FROM user_info WHERE user_id = 1;
使用双竖线拼接
Oracle和部分支持标准SQL的数据库可以使用||运算符拼接字符串,示例代码如下:
-- Oracle中使用||拼接字段 SELECT '用户ID:' || user_id || ',姓名:' || user_name AS user_info FROM user_info WHERE user_id = 1;
MySQL字符串连接函数
MySQL提供了多个专门用于字符串连接的函数,适配不同的合并场景。
CONCAT函数
CONCAT函数可以接收多个参数,将参数按顺序拼接成一个字符串,如果任意一个参数为NULL,返回结果就是NULL。示例代码如下:
-- MySQL中使用CONCAT拼接多个字段
SELECT CONCAT('姓名:', user_name, ',年龄:', age, ',城市:', city) AS user_desc
FROM user_info
WHERE user_id = 1;CONCAT_WS函数
CONCAT_WS函数第一个参数是分隔符,后面的参数会被分隔符连接,并且会忽略NULL值,不会返回NULL。示例代码如下:
-- MySQL中使用CONCAT_WS拼接,用逗号分隔字段
SELECT CONCAT_WS(',', user_name, age, city, phone) AS user_detail
FROM user_info
WHERE user_id = 1;GROUP_CONCAT函数
GROUP_CONCAT函数可以将分组后的多行数据合并成一行字符串,常用于分组场景下的字段合并。示例代码如下:
-- MySQL中使用GROUP_CONCAT合并同一部门的员工姓名 SELECT dept_id, GROUP_CONCAT(user_name SEPARATOR '、') AS dept_users FROM user_info GROUP BY dept_id;
Oracle字符串连接函数
Oracle除了支持||运算符,还有专属的聚合连接函数。
WMSYS.WM_CONCAT函数
WMSYS.WM_CONCAT是Oracle的私有函数,可以将多行数据合并成一行,默认用逗号分隔。示例代码如下:
-- Oracle中使用WMSYS.WM_CONCAT合并同一项目的任务名称 SELECT project_id, WMSYS.WM_CONCAT(task_name) AS project_tasks FROM project_task GROUP BY project_id;
LISTAGG函数
LISTAGG是Oracle 11g及以后版本提供的标准聚合函数,支持自定义分隔符,功能更完善。示例代码如下:
-- Oracle中使用LISTAGG合并数据,自定义分隔符为分号 SELECT dept_id, LISTAGG(user_name, ';') WITHIN GROUP (ORDER BY user_id) AS dept_users FROM user_info GROUP BY dept_id;
SQL Server字符串连接函数
SQL Server从2017版本开始支持STRING_AGG函数,用于多行数据合并。
STRING_AGG函数
STRING_AGG函数第一个参数是要合并的字段,第二个参数是分隔符,还可以配合ORDER BY指定合并后的顺序。示例代码如下:
-- SQL Server中使用STRING_AGG合并同一班级的学生姓名 SELECT class_id, STRING_AGG(student_name, '、') WITHIN GROUP (ORDER BY student_id) AS class_students FROM student_info GROUP BY class_id;
FOR XML PATH方式
在SQL Server 2017之前的版本,可以使用FOR XML PATH实现多行合并,示例代码如下:
-- SQL Server低版本使用FOR XML PATH合并字段
SELECT class_id,
STUFF((SELECT '、' + student_name
FROM student_info t2
WHERE t2.class_id = t1.class_id
ORDER BY student_id
FOR XML PATH('')), 1, 1, '') AS class_students
FROM student_info t1
GROUP BY class_id;不同函数使用注意事项
- 使用CONCAT函数时要注意NULL值的影响,如果有NULL参数可以先使用IFNULL或者COALESCE函数处理
- GROUP_CONCAT在MySQL中有长度限制,默认是1024字节,可以通过调整group_concat_max_len参数修改
- WMSYS.WM_CONCAT是Oracle的非公开函数,不建议在生产环境大量使用,优先选择LISTAGG
- 不同数据库的字符串连接函数不能跨库通用,编写SQL时要根据使用的数据库类型选择对应的方法
| 数据库类型 | 单行拼接函数 | 多行合并函数 |
|---|---|---|
| MySQL | CONCAT、CONCAT_WS | GROUP_CONCAT |
| Oracle | ||、CONCAT | LISTAGG、WMSYS.WM_CONCAT |
| SQL Server | + | STRING_AGG、FOR XML PATH |
SQL字符串连接字段合并CONCATWMSYS.WM_CONCAT修改时间:2026-05-28 00:40:25