postgresql中的数组差异

Jas*_*ine 8 arrays postgresql

我有两个数组,[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)

Kau*_*yak 9

我会使用ORDINALITYoption ofUNNEST并将 an 放入函数ORDER BYarray_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)

演示版