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

ecfsfe2w  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(4)|浏览(160)

如果我有

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

字符串
那么我如何将这个{'b','c','d'}数组添加到列arr_str中,以便得到以下结果

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


我不想SELECT列,创建一个新数组来更新,我只想使用UPDATE查询。

dy2hfwbg

dy2hfwbg1#

我假设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 arr_str is null or 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}' predicate )。这通常是最佳实践,并且在涉及触发器时几乎总是推荐的。
http://rextester.com/GKS7382

7z5jn7bk

7z5jn7bk2#

使用默认的pg安装,您可以合并两个阵列,||操作员:

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

字符串
但在这种情况下,你会得到副本。
为了避免它们,你可以将数组解嵌套到行集中并区分它:

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


如果你的值是整数,有一种更优雅的方法来获取uniq数组值,使用intarray contrib模块和uniq()函数:https://www.postgresql.org/docs/current/static/intarray.html
你可以使用以下命令添加这些整数数组函数:

CREATE EXTENSION intarray

8yparm6h

8yparm6h3#

你可以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

字符串

tjrkku2a

tjrkku2a4#

试试这个代码:

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

字符串

相关问题