PostgreSQL中如何按指定顺序使用string_agg聚合字段名称?
解决方案
要保持field_id中ID的顺序聚合字段名,需要在拆分ID时记录每个ID的原始位置,再按该位置排序后进行聚合。具体查询语句如下:
SELECT l.id, l.field_id, string_agg(d.field_name, ',' ORDER BY pos) AS field_names FROM labelprint l JOIN LATERAL unnest(string_to_array(l.field_id::text, ',')) WITH ORDINALITY AS t(id_str, pos) ON true JOIN datafields d ON d.id = t.id_str::int GROUP BY l.id, l.field_id ORDER BY l.id;
关键步骤说明:
unnest(...) WITH ORDINALITY:将逗号分隔的field_id拆分为行的同时,生成每个元素的原始位置序号pos,这是保留顺序的核心。LATERAL连接:让拆分操作针对labelprint的每一行独立执行,确保每个行的ID拆分和位置对应正确。string_agg(..., ORDER BY pos):聚合字段名时,指定按原始位置序号排序,这样就能严格遵循field_id中的ID顺序。
用你的示例数据测试,该查询会输出预期结果:
id | field_id | field_names ----+----------+------------- 1 | 2,1 | Name,Age
内容的提问来源于stack exchange,提问作者Shantilal Suthar
相关产品推荐
相关产品推荐

