如何用SQL合并列值为字符串?是否需使用SQL Cursor?
嘿,完全不用搞游标这么麻烦!用简单的SQL聚合函数就能轻松实现你要的合并需求——看起来你是想按第一列(比如叫col1)分组,把同一组内第二列(col2)的数值合并成逗号分隔的字符串对吧?不同数据库有对应的现成函数,我给你整理了几个常用场景的写法:
MySQL/MariaDB
用GROUP_CONCAT()函数就能直接搞定,支持去重和排序:
-- 去重合并(把同一col1下的重复col2值只保留一个) SELECT col1, GROUP_CONCAT(DISTINCT col2 ORDER BY col2 SEPARATOR ',') AS merged_col2 FROM your_table GROUP BY col1; -- 保留重复值的合并(不需要去重就去掉DISTINCT) SELECT col1, GROUP_CONCAT(col2 ORDER BY col2 SEPARATOR ',') AS merged_col2 FROM your_table GROUP BY col1;
SQL Server
2017及以上版本可以直接用STRING_AGG(),非常简洁:
SELECT col1, STRING_AGG(DISTINCT col2, ',') WITHIN GROUP (ORDER BY col2) AS merged_col2 FROM your_table GROUP BY col1;
如果是2017之前的老版本,可以用FOR XML PATH的写法来模拟:
SELECT DISTINCT col1, STUFF(( SELECT ',' + CAST(col2 AS VARCHAR) FROM your_table t2 WHERE t2.col1 = t1.col1 ORDER BY col2 FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '') AS merged_col2 FROM your_table t1;
PostgreSQL
用STRING_AGG()函数,注意要把数值类型转成文本:
SELECT col1, STRING_AGG(DISTINCT col2::TEXT, ',' ORDER BY col2) AS merged_col2 FROM your_table GROUP BY col1;
Oracle
11g及以上版本用LISTAGG()函数:
SELECT col1, LISTAGG(DISTINCT col2, ',') WITHIN GROUP (ORDER BY col2) AS merged_col2 FROM your_table GROUP BY col1;
这些写法都是纯SQL的聚合操作,完全不需要用到游标这种复杂的循环逻辑,选对应你数据库的写法就行~
内容的提问来源于stack exchange,提问作者toggen
相关产品推荐
相关产品推荐

