Postgres将数组的每个元素(如果不存在)追加或设置为数组列

时间:2017-04-26 08:30:32

标签: sql arrays postgresql

如果我有

select arr_str from tabl1;
-> {'a', 'b'}

然后如何将此{'b','c','d'}数组添加到列arr_str 这样我就会得到以下结果

select arr_str from tabl1;
-> {'a', 'b', 'c', 'd'}

我不想 SELECT 该列并创建一个新数组进行更新。我只想使用 UPDATE 查询。

4 个答案:

答案 0 :(得分:5)

使用默认的pg install,您可以使用||合并两个数组运营商:

select arr_str || '{a, b}' from tabl1

但在这种情况下,你会得到重复。

要避免它们,您可以将数组替换为rowset并将其区分开来:

select ARRAY(SELECT DISTINCT UNNEST(arr_str || '{a,b,c}')) from tabl1

如果你的值是整数,那么使用intarray contrib模块和uniq()函数获得uniq数组值有更优雅的方法: https://www.postgresql.org/docs/current/static/intarray.html

您可以使用以下方法添加这些整数数组函数:

CREATE EXTENSION intarray

答案 1 :(得分:4)

我假设arr_str属于text[]类型(虽然你没有使用正确的格式,所以我可能错了;如果是这样的话,您需要将您的价值转移到text[])。

如果要删除arr_str列中已存在的重复项,请使用以下语句:

update tabl1
set    arr_str = (select array_agg(distinct e) from unnest(arr_str || '{b,c,d}') e)
where  not arr_str @> '{b,c,d}'

或者,如果要保留现有重复项,请使用以下内容:

update tabl1
set    arr_str = arr_str || array(select unnest('{b,c,d}'::text[]) except select unnest(arr_str))
where  not arr_str @> '{b,c,d}'

这两个陈述都不会触及行,这些行无论如何都不会受到影响(请查看where not arr_str @> '{b,c,d}'谓词)。这通常是最佳实践,并且在涉及触发器时几乎总是被推荐。

http://rextester.com/GKS7382

答案 2 :(得分:1)

你可以concatenate数组,然后聚合不同的值:

t=# with a as (select unnest('{a, b}'::text[] || '{b,c,d}'::text[]) a) select array_agg(distinct a) from a;
 array_agg
-----------
 {a,b,c,d}
(1 row)

Time: 1.312 ms

答案 3 :(得分:0)

试试这段代码:

select array(select distinct unnest(string_to_array('a,b',',') || string_to_array('b,c,d',',')) order by 1)