存在如下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是一个允许重复元素的array.如何创建查询以获得以下输出?正在使用的数据库是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"]

推荐答案

您可以取消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).

usr color_id_array color_name_array
amy {2,2,3} {green,green,blue}
bob {2,2,2} {green,green,green}
john {1,2} {red,green}

fiddle

Sql相关问答推荐

按postquist中的日期查询json列

如何重用表值用户定义函数调用的结果?

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

SQL是否可以计算每年的所有日期变化?

如何在SQL中更新Json字符串

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

缺少日期标识

表函数的作用域和功能

如何在多列上编写具有不同条件的查询?

根据不同日期标准分配组的逻辑

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

SQL Server: 将JSON对象数组转换为表格格式

每个ID的SQL返回可能的最低级别及其值

使用给定的变量对在循环中执行更新语句

在 SQL 中使用循环遍历按时间顺序排列的数据

存储过程 - 动态 SQL 中不同列值的计数

我现在如何显示重复的汽车? postgresql

在sql server中创建唯一标识符列

从 Pyspark 转换为具有多个分组条件的语句时的情况

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?