合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数

本文介绍如何使用SQL查询技巧来实现数据的聚合显示,包括利用FOR XML PATH、STUFF函数及REPLACE函数去除重复值和多余符号,实现数据的有效整理。

示例表 tb 数据如下

id value
—————
1 aa
1 bb
2 aaa
2 bbb
2 ccc

第一种

SELECT id, [val]=( SELECT [value] +',' FROM tb AS b WHERE b.id = a.id FOR XML PATH('') ) FROM tb AS a
第一种显示结果
1 aa,bb,
1 aa,bb,
2 aaa,bbb,ccc,
2 aaa,bbb,ccc,
2 aaa,bbb,ccc,

第二种

复制代码
SELECT id, [val]=( SELECT [value] +',' FROM tb AS b WHERE b.id = a.id FOR XML PATH('') ) FROM tb AS a GROUP BY id
复制代码
第二种显示结果
1 aa,bb,
2 aaa,bbb,ccc,

第三种 (用STUFF函数替换掉首端的逗号)

复制代码
SELECT id, [val]=STUFF( (SELECT ','+[value] FROM tb AS b WHERE b.id = a.id FOR XML PATH('')) , 1 , 1 , '' ) FROM tb AS a GROUP BY id
复制代码
第三种显示结果
1 aa,bb
2 aaa,bbb,ccc

STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。
STUFF ( character_expression , start , length ,character_expression_insert )

第四种 (用REPLACE函数将所有空格替换成逗号)

复制代码
SELECT id, [val]= REPLACE( (SELECT [value] AS [data()] FROM tb AS b WHERE b.id = a.id FOR XML PATH('')) , ' ', ',') FROM tb AS a GROUP BY id
复制代码
结果与第三种一样。
### 多行数据合并为单行的 SQL 实现方法 在 SQL 查询中,将多行数据合并为单行是常见的需求,尤其在统计和报生成场景中。不同数据库提供了不同的函数来实现这一功能。 #### Oracle 中的 `LISTAGG()` 函数 Oracle 提供了 `LISTAGG()` 函数,用于将多行数据合并一行,并支持指定分隔符。例如,将某一字段按分组合并为逗号分隔的字符串: ```sql SELECT column1, LISTAGG(column2, ', ') WITHIN GROUP (ORDER BY column2) AS column2_list FROM your_table GROUP BY column1; ``` 此方法适用于需要按组合并个值为单个字段的场景,同时支持排序功能,确保合并字段的顺序可控[^1]。 #### MySQL 中的 `GROUP_CONCAT()` 函数 在 MySQL 中,可以使用 `GROUP_CONCAT()` 函数实现类似功能。该函数多行的值合并为一个字符串,并支持指定分隔符: ```sql SELECT sport, GROUP_CONCAT(name SEPARATOR ', ') AS name_list FROM table_1 GROUP BY sport; ``` 该函数适用于需要将个记录合并为一个字符串字段的场景,但需要注意字段长度限制(默认为 1024 字符)[^2]。 #### SQL Server 中使用 `FOR XML PATH` SQL Server 没有内置的 `GROUP_CONCAT` `LISTAGG` 函数,但可以通过 `FOR XML PATH` 实现多行合并为单行: ```sql SELECT column1, STUFF(( SELECT ',' + column2 FROM your_table t2 WHERE t2.column1 = t1.column1 FOR XML PATH('')), 1, 1, '') AS column2_list FROM your_table t1 GROUP BY column1; ``` 该方法利用 XML 路径将多行拼接为字符串,并通过 `STUFF` 函数移除起始逗号,适用于复杂字符串拼接场景[^3]。 #### 使用 `REGEXP_REPLACE` 去除 HTML 标签并合并多行 在 Oracle 中,若字段包含 HTML 标签其他非文本内容,可结合 `REGEXP_REPLACE` 函数去除干扰内容,并将多行合并为单行: ```sql SELECT REGEXP_REPLACE( REPLACE(REPLACE(CONTENT, chr(10), ' '), chr(13), ' '), '<[^>]*>|nbsp;|&', '' ) AS cleaned_content FROM PAYOUT_APPLICATIONFORM WHERE applicationform_id = '63f063d6-aac6-4ad4-8591-141ec0f93b63'; ``` 此方法可清除 HTML 标签和换行符,使最终结果保持在单行,适用于富文本内容的清洗和合并[^4]。 --- ### 相关问题 1. 在 MySQL 中如何控制 `GROUP_CONCAT()` 的最大长度? 2. 如何在 SQL Server 中优化 `FOR XML PATH` 的字符串拼接性能? 3. Oracle 的 `LISTAGG()` 是否支持去重合并? 4. 在处理富文本字段时,除了 `REGEXP_REPLACE` 还有哪些清洗方法? 5. 如何在不支持 `GROUP_CONCAT` 的数据库中实现多行合并
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值