如何在SQL中合并多行垂直VARCHAR值(含表结构与输出示例)
多行VARCHAR值垂直合并的SQL实现方案
嗨,这个需求在日常SQL开发里太常见了!核心思路就是按Country分组后,把同组的State值聚合拼接成一个字符串。不同的SQL数据库有各自专属的函数,我给你逐个梳理清楚,直接就能套用:
MySQL/MariaDB 实现
用GROUP_CONCAT函数就能轻松搞定,默认就是逗号分隔,正好匹配你的需求:
SELECT Country, GROUP_CONCAT(State SEPARATOR ', ') AS State FROM country_states -- 这里替换成你的实际表名 GROUP BY Country;
👉 注意:GROUP_CONCAT默认有长度限制(默认1024字符),如果你的拼接结果很长,可以通过修改group_concat_max_len参数调整,或者用CAST(State AS CHAR(1000))这类方式扩大长度。
SQL Server 实现
如果是2017及以上版本,直接用官方支持的STRING_AGG函数,用法非常直观:
SELECT Country, STRING_AGG(State, ', ') AS State FROM country_states GROUP BY Country;
要是你用的是2016及更早的老版本,就用STUFF + FOR XML PATH的兼容写法:
SELECT Country, STUFF(( SELECT ', ' + State FROM country_states cs2 WHERE cs2.Country = cs1.Country FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS State FROM country_states cs1 GROUP BY Country;
Oracle 实现
11gR2及以上版本可以用LISTAGG函数,还能指定拼接顺序:
SELECT Country, LISTAGG(State, ', ') WITHIN GROUP (ORDER BY State) AS State FROM country_states GROUP BY Country;
这里的ORDER BY State是可选的,要是不需要排序直接去掉就行。
PostgreSQL 实现
用STRING_AGG函数,支持排序可选:
-- 基础写法 SELECT Country, STRING_AGG(State, ', ') AS State FROM country_states GROUP BY Country; -- 带排序的写法 SELECT Country, STRING_AGG(State, ', ') WITHIN GROUP (ORDER BY State) AS State FROM country_states GROUP BY Country;
通用注意点
- 如果
State列存在NULL值,这些聚合函数都会自动忽略NULL,要是想把NULL显示成空字符串或者其他值,可以用COALESCE(State, '')替换原字段。 - 拼接后的字符串长度要注意对应数据库的字段限制,必要时用
CAST转换为更长的类型(比如NVARCHAR(MAX))。
内容的提问来源于stack exchange,提问作者Anup
相关产品推荐
相关产品推荐

