小编典典

从数组创建字符串

sql

我在PostgreSQL中有一个表,其中包含:

id   name   arrayofparents
1     First
2     Second      {1}
3     Second_Sec  {1,2}
4     Third       {1,2,3}
5     Second_A    {1}
6     Other
7     Trash       {6}

arrayofparents是类型,integer[]它包含具有正确顺序的该行的父记录列表。

id=4家长:First然后SecondSecond_sec

如何编写一个查询,该查询对于任何给定的ID都会生成其父母姓名的字符串?

例如:

id=3First->Second

id=4First->Second->Second_sec

id=7Other

编辑: 如果可能的话,我希望请求的IDname总是会出现。 id=3First->Second->Second_sec

id=4First->Second->Second_sec->Third

id=7Other->Trash

id=6Other


阅读 230

收藏
2021-04-07

共1个答案

小编典典

您可以结合使用诸如generate_subscripts和array之类的多项操作来获得结果:

with mtab as (
      SELECT id, name, array_append(arrayofparents,id) as arrayofparents,
      generate_subscripts(array_append(arrayofparents, id), 1) AS p_id FROM tab where id=2
)
select distinct array_to_string(
  array(
    select tab.name from tab join mtab t on tab.id=t.arrayofparents[t.p_id]
  ), '->'
) ;

实时示例Sqlfiddle

或将外部联接与以下任何一项结合使用:

SELECT coalesce(string_agg(p.name, '->') || '->' || t.name, t.name) AS parentnames
FROM tab AS t
  LEFT JOIN tab AS p ON p.id = ANY(t.arrayofparents)
 where t.id =7 
GROUP BY t.id, t.name

实时示例Sqlfiddle

2021-04-07