You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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标准,只能通过自连接+聚合函数模拟迭代拼接,但这种方法非常繁琐,且仅适用于分组内行数较少的场景:

  1. 先通过自连接为分组内的每行生成行号(SQL 1999没有ROW_NUMBER()函数)
  2. 逐行拼接文本,需要提前知道分组内的最大行数

示例代码(逻辑示意):

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:20:56