postgresql - 创建 CSV 文件时,Postgres id 到数组中的名称映射

标签 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 应该被组名替换。

最佳答案

设置:

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)

关于postgresql - 创建 CSV 文件时,Postgres id 到数组中的名称映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644470/

相关文章:

postgresql - 当 postgres 中的文件大于 1GB 时,在哪里调用分割文件?

postgresql - psql 命令行字符串中的换行符何时重要?

postgresql - psql - 将命令结果保存到文件

PSQL 忽略端口参数

postgresql - 如何使用带 SSL key 的 psql?

postgresql - 为 PostgreSQL 中的记录变量动态传递列名

postgresql - Python SqlAlchemy : Data are inserted with NULL values instead of specified values

postgresql - postgres 函数参数是通过引用还是值传递的?

sql - 如何在 psql 中使用脚本变量?

postgresql - 如何优化从 JOIN 获取的集合中选择一个随机行