如何在PostgreSQL中删除数组元素?

时间:2016-06-20 08:36:47

标签: sql arrays postgresql

是否可以删除数组中的某些元素?
在删除元素之前,Array1是:

{1,2,3,4}

包含我想删除的一些元素的Array2:

{1,4}

我想得到:

 {2,3}

如何操作?

7 个答案:

答案 0 :(得分:8)

unnest()array_agg()一起使用,例如:

with cte(array1, array2) as (
    values (array[1,2,3,4], array[1,4])
    )
select array_agg(elem)
from cte, unnest(array1) elem
where elem <> all(array2);

 array_agg 
-----------
 {2,3}
(1 row)

如果您经常需要此功能,请定义简单功能:

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)
$$;

您可以将该函数用于任何数组,而不仅仅是int[]

select array_diff(array['a','b','c','d'], array['a','d']);

 array_diff 
------------
 {b,c}
(1 row) 

答案 1 :(得分:7)

使用intarray extension,您只需使用-

select '{1,2,3,4}'::int[] - '{1,4}'::int[]

结果:

{2,3}

Online demonstration

如果你还没有,你需要install intarray扩展名。如果你正在处理整数数组,它会添加许多方便的函数和运算符。

答案 2 :(得分:5)

在版本9.3及更高版本中,您可以这样做。

array_remove(anyarray, anyelement)

例如:SELECT array_remove(ARRAY['1','2','3','4'],'1')

结果类似于{2,3,4}

答案 3 :(得分:4)

在此post的帮助下:

select array_agg(elements) from 
   (select unnest('{1,2,3,4}'::int[]) 
except 
   select unnest('{1,4}'::int[])) t (elements)

结果:

{2,3}

答案 4 :(得分:0)

用户数组维标注

array[<start index>:<end index>] 

WITH t(stack, dim) as (
  VALUES(ARRAY[1,2,3,4], ARRAY[1,4])
) SELECT stack[dim[1]+1:dim[2]-1] FROM t

答案 5 :(得分:0)

您可以在处理 bigint/int8 数字并希望保持顺序时使用此函数:

CREATE OR REPLACE FUNCTION arr_subtract(int8[], int8[])
  RETURNS int8[] AS
$func$
SELECT ARRAY(
    SELECT a
    FROM   unnest($1) WITH ORDINALITY x(a, ord)
    WHERE  a <> ALL ($2)
    ORDER  BY ord
    );
$func$  LANGUAGE sql IMMUTABLE;

我从以下对类似问题的回答中得到了这个解决方案:https://stackoverflow.com/a/8584080/1544473

答案 6 :(得分:-1)

这个答案是我认为最简单的: https://stackoverflow.com/a/6535089/673187

SELECT array(SELECT unnest(:array1) EXCEPT SELECT unnest(:array2));

因此,当您需要从数组列中删除某些元素时,可以轻松地在UPDATE命令中使用它:

UPDATE table1 SET array1_column=(SELECT array(SELECT unnest(array1_column) EXCEPT SELECT unnest('{2, 3}'::int[])));