能否从数组中移除多个元素? 移除元素前,Array1 的值为:
{1,2,3,4}
包含一些需要移除元素的Array2:
{1,4}
我希望获得:
{2,3}
如何操作?
能否从数组中移除多个元素? 移除元素前,Array1 的值为:
{1,2,3,4}
包含一些需要移除元素的Array2:
{1,4}
我希望获得:
{2,3}
如何操作?
使用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)
all()
函数是做什么用的? - Dex借助于这篇文章的帮助:
select array_agg(elements) from
(select unnest('{1,2,3,4}'::int[])
except
select unnest('{1,4}'::int[])) t (elements)
结果:
{2,3}
-
即可:select '{1,2,3,4}'::int[] - '{1,4}'::int[]
结果:
{2,3}
如果尚未安装intarray扩展程序,则需要进行安装以便在处理整数数组时使用其提供的众多方便函数和操作符。
intarray
扩展:https://www.postgresql.org/docs/current/static/intarray.html - user330315我认为这是最简单的答案: https://dev59.com/Cmw15IYBdhLWcg3wkMnz#6535089
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[])));
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;
用户数组重新维度注释
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
array_remove()
删除单个元素,但是除非安装了intarray
模块,否则您无法轻松地从另一个数组中删除一个数组。 - user330315array_remove
;对于更多的值,你可以使用循环和array_remove
。 - Sławomir Lenart