繁体   English   中英

array_agg去除重复项,其中元素也是arrays

[英]Remove duplicates from array_agg, where elements are also arrays

在 Postgres 11 数据库中,我在两个连接到 MAIN 表的视图中有两个 arrays:

vw_ideas_role_direction_mappings.user_direction_id - 数组(如 {101,103,} 或 {101,103} 或 {101,} 或 {101,,,,104}) vw_ideas_role_category_mappings.user_direction_id - 数组如前。

视图 vw_ideas_role_category_mappings 的 DDL:

category_id - int8
user_direction_id - 数组——无限制

视图 vw_ideas_role_direction_mappings 的 DDL:

direction_id - int8
user_direction_id - 数组——无限制

DDL表的想法:

id - bigserial -- 没有限制

以及以下查询,我在其中加入了所有内容:

SELECT i.id,
         array_agg(dvircm.user_direction_id || dvirdm.user_direction_id) AS directions_id
           FROM idea.ideas i
             LEFT JOIN vw_ideas_role_direction_mappings  = i.direction_id
             LEFT JOIN vw_ideas_role_category_mappings dvircm ON dvircm.category_id  = i.category_id
GROUP BY i.id

所以arrays中可以有NULL并且重复。

此查询不会删除它们,而且还会抛出错误 - 无法累积不同维度的 arrays(可能是因为 arrays 中数字前后有逗号','?因为当我创建数组 user_direction_id 时,我使用此查询

array_agg(distinct vw_user_data_all_roles.direction_id))

合并 2 arrays 后如何消除错误并删除重复项和 null?

认为这会做你想要的:

SELECT i.id, sub.directions_id
FROM   idea.ideas i
LEFT   JOIN LATERAL (
   SELECT ARRAY (
      SELECT u.id
      FROM   vw_ideas_role_direction_mappings d, unnest(d.user_direction_id) u(id)
      WHERE  d.direction_id = i.direction_id
      AND    u.id IS NOT NULL
      UNION
      SELECT u.id
      FROM   vw_ideas_role_category_mappings c, unnest(c.user_direction_id) u(id)
      WHERE  c.category_id  = i.category_id
      AND    u.id IS NOT NULL
      )
   ) sub(directions_id) ON sub.directions_id <> '{}';  -- exclude empty array?

取消嵌套后的UNION删除重复的数组元素。
NULL 个值被删除。

关于 ARRAY 构造函数:

由于 ARRAY 构造函数总是返回一行(就像聚合函数),我们可以使用CROSS JOIN 否则,我们将使用LEFT JOIN.. ON true 关于LATERAL连接:

如果您需要保留一些原始顺序,请考虑WITH ORDINALITYORDER BY ... 请参阅:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM