Postgres id用于在创建CSV文件时命名数组中的映射

时间:2015-09-18 05:29:15

标签: postgresql psql

我有一个表,其中包含组名称映射的ID。

1. GroupA
2. GroupB
3. GroupC
.
.
.
15 GroupO

我有用户表和userId进行组ID映射,组ID被定义为用户表中的数组

User1 {1,5,7}
User2 {2,5,9}
User3 {3,5,11,15}
.
.
.

我希望以这种方式组合到表中以检索CSV文件中的userID和groupName映射。

例如:User1 {GroupA,GroupE,GroupG}

创建CSV文件时,基本上组ID应该被组名替换。

2 个答案:

答案 0 :(得分:2)

假设您有两种表格形式:

Table groups
 Column   |  Type   
-----------+---------
 groupname | text     
 groupid   | integer  

Table users
 Column  |   Type    
----------+----------
 username | text     
 groupids | integer[]  <-- group ids as inserted in table groups

您可以使用以下代码查询用组名替换组ID的用户:

WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users) 
SELECT username,array_agg(groupname) AS groups 
FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid 
GROUP BY username

如果您需要将组作为字符串(对于csv导出很有用),请使用array_to_string语句包围查询:

SELECT username, array_to_string(groups,',') FROM 
(
  WITH users_subquery AS (select username,unnest (groupids) AS groupid FROM users) 
  SELECT username,array_agg(groupname) AS groups 
  FROM users_subquery JOIN groups ON users_subquery.groupid = groups.groupid 
  GROUP BY username
) as foo;

结果:

 username |    groups    
----------+-----------------
 user1    | group1,group2
 user2    | group2,group3

答案 1 :(得分:2)

设定:

create table mapping(id int, group_name text);
insert into mapping
select i, format('Group%s', chr(i+ 64))
from generate_series(1, 15) i;

create table users (user_name text, user_ids int[]);
insert into users values
('User1', '{1,5,7}'),
('User2', '{2,5,9}'),
('User3', '{3,5,11,15}');

一步一步(了解查询,请参阅SqlFiddle):

使用unnest()列出一行中的所有单个user_id:

select user_name, unnest(user_ids) user_id
from users

通过加入映射替换user_id和group_name:

select user_name, group_name
from (
    select user_name, unnest(user_ids) id
    from users
    ) u
join mapping m on m.id = u.id

将group_name聚合到user_name的数组中:

select user_name, array_agg(group_name)
from (
    select user_name, group_name
    from (
        select user_name, unnest(user_ids) id
        from users
        ) u
    join mapping m on m.id = u.id
    ) m
group by 1

使用复制命令中的最后一个查询:

copy (
select user_name, array_agg(group_name)
from (
    select user_name, group_name
    from (
        select user_name, unnest(user_ids) id
        from users
        ) u
    join mapping m on m.id = u.id
    ) m
group by 1
)
to 'c:/data/example.txt' (format csv)