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

如何将SQL结果集每行转为逗号分隔字符串且无需指定列名

问题场景

假设存在测试表test_table,表内数据如下:

id    col1  col2  col3
--    ----  ---- -----
1      A      A     A
2      B      B     B
3      C      C     C
实现需求

需要编写SQL查询满足以下要求:

  • 将每行的所有列值拼接为单引号包裹、逗号分隔的字符串
  • SELECT语句中无需显式指定col1、col2、col3等具体列名

预期按行输出的格式如下:

'A', 'A', 'A'
'B', 'B', 'B'
'C', 'C', 'C'
现存问题

已尝试的SQL写法如下:

select concat('''', string_agg(value, ''','''), '''') as res
from (
    select (json_each_text(row_to_json(test_table))).value
    from test_table
) x

该写法会将所有行的内容聚合为单条字符串,不符合按行输出的要求,实际错误输出结果为:

'A', 'A', 'A','B', 'B', 'B','C', 'C', 'C'
修正方案

问题根源是子查询拆分每行的列值时,没有保留原始行的唯一标识,外层聚合时没有分组维度,导致所有拆分出的值被合并到同一条结果中。修正后的SQL如下:

select 
  concat('''', string_agg(j.value, ''',''' order by j.ordinality), '''') as res
from test_table t,
json_each_text(row_to_json(t)) with ordinality j(key, value, ordinality)
group by t.id
order by t.id;

修正逻辑说明:

  • 拆分JSON时通过with ordinality记录列的原始顺序,保证拼接后列顺序和原表一致
  • 直接关联原表主键id作为分组依据,按原始行单独聚合列值,实现逐行拼接的效果
  • 不需要在SELECT子句中显式指定任何业务列名,满足动态适配列的要求

内容的提问来源于stack exchange,提问作者pikk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:12:34