如何将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
相关产品推荐
相关产品推荐

