是否可以删除数组中的某些元素?
在删除元素之前,Array1是:
{1,2,3,4}
包含我想删除的一些元素的Array2:
{1,4}
我想得到:
{2,3}
如何操作?
答案 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}
如果你还没有,你需要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[])));