postgresql 在postgres中限制string_agg排序依据

gz5pxeao  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(2)|浏览(381)

在使用postgres数据库时,我遇到了一种情况,我必须根据存储在表中的ID来显示列名,并以逗号分隔。
表1名称:标签印刷

id field_id
1  1,2

表2名称:资料栏位

id field_name
1  Age
2  Name
3  Sex

现在,为了通过从table1(即field_id列中的1,2)选取id来显示字段名,我希望field_name的显示顺序与它们各自的id相同,如
预期结果:

id field_id field_name
1  2,1      Name,Age

为了实现上述结果,我编写了以下查询:

select l.id,l.field_id ,string_agg(d.field_name,',') as field_names
from labelprint l
join datafields d on d.id = ANY(string_to_array(l.field_id::text,','))
group by l.id
order by l.id

但是,string_agg()函数会按升序对最终字符串进行排序,并显示如下所示的输出:

id field_id field_name
1  2,1      Age, Name

正如您所看到的,我希望按照field_id值的顺序显示的field_name列中没有维护顺序。
任何建议/帮助都是非常感谢的。
先谢了!
已经在描述中提到了。

ru9i0ody

ru9i0ody1#

虽然这对性能、可读性和可维护性来说可能很糟糕,但您可以动态计算所需的顺序:

select l.id,l.field_id,
  string_agg(d.field_name,',' 
    order by array_position(string_to_array(l.field_id::text,','),d.id)
  ) as field_names
from labelprint l
join datafields d on d.id = ANY(string_to_array(l.field_id::text,','))
group by l.id
order by l.id;

你至少应该把你的数组存储为一个实际的数组,而不是一个逗号分隔的字符串。或者可以使用一个中间表,根本不存储数组。

8xiog9wr

8xiog9wr2#

只需对现有查询进行少量修改,您就可以按如下所示执行操作:

select l.id, l.field_id, string_agg(d.field_name,',') as field_names
from labelprint l
join datafields d on d.id::varchar = ANY(string_to_array(l.field_id,','))
group by l.id, l.field_id
order by l.id

Demo here

相关问题