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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:09