postgres使用$ delimiter加入列表

时间:2015-01-08 19:04:46

标签: string postgresql join delimiter

从这些表中:

select group, ids 
from some.groups_and_ids; 

结果:

group   | group_ids
     ---+----  
winners | 1$4
losers  | 4  
others  | 2$3$4

select id,name from some.ids_and_names; 

id | name  
---+----  
1  | bob  
2  | robert
3  | dingus
4  | norbert

你会如何回归:

winners | bob, norbert
losers  | norbert 
others  | robert, dingus, norbert

2 个答案:

答案 0 :(得分:1)

with normalized  (group_name, id) as (
  select group_name, unnest(string_to_array(group_ids,'$')::int[])
  from groups_and_ids
)
select n.group_name, string_agg(p.name,',' order by p.name)
from normalized n
  join ids_and_names p on p.id = n.id
group by n.group_name;

第一部分(common table expression)通过在groups_and_ids表上创建适当的视图来规范您的破桌设计。然后,实际查询将ids_and_names表连接到组的规范化版本,并再次聚合名称。

注意我将group重命名为group_name,因为group是保留关键字。

SQLFiddle:http://sqlfiddle.com/#!15/2205b/2

答案 1 :(得分:0)

是否可以重新设计数据库?将所有group_id放在一列中会让生活变得艰难。如果你的表是例如。

group | group_id

winners | 1
winners | 4
losers | 4

等。这很简单。事实上,下面的查询会这样做,虽然我犹豫是否发布它,因为它鼓励糟糕的数据库设计(恕我直言)!

P.S。我冒昧地重命名了一些专栏,因为它们是保留字。你可以逃脱它们,但为什么要让自己的生活变得困难?

select group_name,array_to_string(array_agg(username),', ') -- array aggregation and make it into a string
from

(
select group_name,theids,username
from ids_and_names
inner join

(select group_name,unnest(string_to_array(group_ids,'$')) as theids -- unnest a string_to_array to get rows

from groups_and_ids) i
on i.theids = cast(id as text)) a
group by group_name