如果我有
select arr_str from tabl1;
-> {'a', 'b'}
然后如何将此{'b','c','d'}
数组添加到列arr_str
这样我就会得到以下结果
select arr_str from tabl1;
-> {'a', 'b', 'c', 'd'}
我不想 SELECT 该列并创建一个新数组进行更新。我只想使用 UPDATE 查询。
答案 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}'
谓词)。这通常是最佳实践,并且在涉及触发器时几乎总是被推荐。
答案 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)