SQL 1999能否将同组多行文本合并为单行字符串?
在SQL 1999中实现同组文本合并的可行性
SQL 1999标准本身没有原生的字符串聚合功能(比如后续SQL版本或厂商扩展里的STRING_AGG、LISTAGG这类函数),也不支持XML/JSON相关的聚合操作,但并非完全无法实现文本合并——具体分两种情况:
依赖数据库厂商扩展(推荐)
在SQL 1999时期,主流数据库厂商已经推出了各自的专有字符串聚合函数,能快速实现需求:
- Oracle:使用
WM_CONCAT(非SQL标准,但当时已可用)
SELECT ID, Name, City, WM_CONCAT(' ' || Text) AS Text FROM your_table GROUP BY ID, Name, City;
- MySQL:使用
GROUP_CONCAT
SELECT ID, Name, City, GROUP_CONCAT(Text SEPARATOR ' ') AS Text FROM your_table GROUP BY ID, Name, City;
纯SQL 1999标准实现(无厂商扩展)
如果必须严格遵循SQL 1999标准,只能通过自连接+聚合函数模拟迭代拼接,但这种方法非常繁琐,且仅适用于分组内行数较少的场景:
- 先通过自连接为分组内的每行生成行号(SQL 1999没有
ROW_NUMBER()函数) - 逐行拼接文本,需要提前知道分组内的最大行数
示例代码(逻辑示意):
SELECT t1.ID, t1.Name, t1.City, MAX(CASE WHEN rn = 1 THEN t1.Text ELSE '' END) || MAX(CASE WHEN rn = 2 THEN ' ' || t2.Text ELSE '' END) AS Text FROM ( SELECT a.ID, a.Name, a.City, a.Text, COUNT(b.Text) AS rn FROM your_table a LEFT JOIN your_table b ON a.ID = b.ID AND a.Name = b.Name AND a.City = b.City AND b.Text <= a.Text GROUP BY a.ID, a.Name, a.City, a.Text ) t1 LEFT JOIN ( SELECT a.ID, a.Name, a.City, a.Text, COUNT(b.Text) AS rn FROM your_table a LEFT JOIN your_table b ON a.ID = b.ID AND a.Name = b.Name AND a.City = b.City AND b.Text <= a.Text GROUP BY a.ID, a.Name, a.City, a.Text ) t2 ON t1.ID = t2.ID AND t1.Name = t2.Name AND t1.City = t2.City AND t2.rn = 2 WHERE t1.rn = 1 GROUP BY t1.ID, t1.Name, t1.City;
这种方法的缺点很明显:分组内行数越多,需要的自连接层数就越多,性能会急剧下降,实用性不高。
结论
SQL 1999标准本身不支持原生文本合并,但借助厂商扩展可以轻松实现;纯标准SQL的实现方式繁琐且受限,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者Lukoooooooooo
相关产品推荐
相关产品推荐

