我有两个数组,[1,2,3,4,7,6]并且[2,3,7]在 PostgreSQL 中可能有共同的元素。我想要做的是从第一个数组中排除第二个数组中存在的所有元素。到目前为止,我已经取得了以下成绩:
SELECT array
(SELECT unnest(array[1, 2, 3, 4, 7, 6])
EXCEPT SELECT unnest(array[2, 3, 7]));
Run Code Online (Sandbox Code Playgroud)
但是,排序不正确,因为结果{4,6,1}不是所需的{1,4,6}. 我怎样才能解决这个问题 ?
我最终使用以下定义(取自此处)创建了一个自定义函数,该函数解决了我的问题:
create or replace function array_diff(array1 anyarray, array2 anyarray)
returns anyarray language sql immutable as $$
select coalesce(array_agg(elem), '{}')
from unnest(array1) elem
where elem <> all(array2)
$$;
Run Code Online (Sandbox Code Playgroud)
我会使用ORDINALITYoption ofUNNEST并将 an 放入函数ORDER BY中array_agg,同时将其转换回数组。NOT EXISTS比除了使其更简单之外更受欢迎。
SELECT array_agg(e order by id)
FROM unnest( array[1, 2, 3, 4, 7, 6] ) with ordinality as s1(e,id)
WHERE not exists
(
SELECT 1 FROM unnest(array[2, 3, 7]) as s2(e)
where s2.e = s1.e
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3315 次 |
| 最近记录: |