PostgreSQL如何查找两数组列共同值并将其从tar列中移除
PostgreSQL数组交集元素移除实现方案
方法1:直接使用intarray扩展的差集运算符(适配你现有代码)
你当前代码里用的&数组交集运算符本身就是intarray扩展提供的,所以直接用同扩展的-运算符即可快速实现tar数组减去交集的需求:
WITH t1 AS ( SELECT DISTINCT ind, tar FROM table_1 JOIN table_2 USING (id) LIMIT 50 ), t2 AS ( SELECT ind, tar - (ind & tar) AS tar FROM t1 ) SELECT * FROM t2;
方法2:通用原生语法(无需扩展,支持任意类型数组)
如果不想依赖扩展或者是其他元素类型的数组,可以通过拆分、过滤、重组数组的方式实现:
WITH t1 AS ( SELECT DISTINCT ind, tar FROM table_1 JOIN table_2 USING (id) LIMIT 50 ), t2 AS ( SELECT ind & tar AS common_el, ind, tar FROM t1 ) SELECT ind, COALESCE(ARRAY_AGG(tar_element), '{}') AS tar FROM t2 LEFT JOIN LATERAL unnest(tar) AS t(tar_element) ON tar_element <> ALL(common_el) -- 过滤掉同时存在于ind里的元素 GROUP BY ind, tar;
两种方案都可以完全匹配你给出的预期输出结果,如果需要保留tar数组的原始元素顺序,在方法2的ARRAY_AGG里加上排序规则即可。
内容的提问来源于stack exchange,提问作者joasa
相关产品推荐
相关产品推荐

