在PostgreSQL中,如何使用数组中的每个元素作为另一个表中的键?

kyks70gy  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(133)

有一个SQL查询如下:
质询A:

SELECT
    user,
    color_id_array
FROM
    relation;

结果A:

user, color_id_array
john, [1, 2]
bob, [2, 2, 2]
amy, [2, 2, 3]

质询B:

SELECT
    inf_name,
    inf_code
FROM
    infomation;

结果B:

inf_code, inf_name
1, red
2, green
3, blue

结果A中的color_id_array是一个允许重复元素的数组。如何创建一个查询来获得以下输出?使用的DB是PostgreSQL。
预期输出:

user, color_id_array, color_name_array
john, [1, 2], ["red", "green"]
bob, [2, 2, 2], ["green", "green", "green"]
amy, [2, 2, 3], ["green", "green", "blue"]
mnemlml8

mnemlml81#

您可以取消ID数组的嵌套(同时跟踪它们的原始位置),使用连接来获取信息表,然后再次聚合:

select r.*, array_agg(i.inf_name order by rx.color_seq) color_name_array
from relation r
cross join lateral unnest(r.color_id_array) with ordinality rx(color_code, color_seq)
inner join information i on i.inf_code = rx.color_code
group by r.user

group by子句应该包含relation表的主键(我假设为user)。
| 乌瑟尔|颜色标识数组|颜色名称数组|
| - ------|- ------|- ------|
| 艾米|{二、二、三}|{绿色,绿色,蓝色}|
| 摆锤|{二、二、二}|{绿色,绿色,绿色}|
| 约翰|{1、2}|{红色,绿色}|
fiddle

相关问题