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

Sql Postgres将数组的每个元素(如果不存在)追加或设置到数组列,sql,arrays,postgresql,Sql,Arrays,Postgresql,如果我有 select arr_str from tabl1; -> {'a', 'b'} 那么如何将这个{'b','c','d'}数组添加到列arr\u str 这样我就可以得到下面的结果 select arr_str from tabl1; -> {'a', 'b', 'c', 'd'} 我不想选择列并创建新数组进行更新。我只想使用更新查询。您可以使用数组,然后聚合不同的值: t=# with a as (select unnest('{a, b}'::text[] || '

如果我有

select arr_str from tabl1;
-> {'a', 'b'}
那么如何将这个
{'b','c','d'}
数组添加到列
arr\u str
这样我就可以得到下面的结果

select arr_str from tabl1;
-> {'a', 'b', 'c', 'd'}
我不想选择列并创建新数组进行更新。我只想使用更新查询。

您可以使用数组,然后聚合不同的值:

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
请尝试以下代码:

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

使用默认pg安装,您可以使用| |运算符合并两个阵列:

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

为了避免它们,您可以将最新的数组unnest放入行集中并对其进行区分:

如果您的值是整数,那么使用intarray contrib模块和uniq()函数可以更优雅地获取uniq数组值:

可以使用以下命令添加这些整数数组函数:

在阵列中创建扩展名

我假设
arr\u 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}”
谓词)。当涉及触发器时,这通常是最佳实践,并且几乎总是被推荐的


有可能
arr\u str
可能包含重复的值?arr\u str可以包含重复的值,但我不想添加重复的值。请回答问题。。。只想使用update QUERY,但您需要保留源代码的重复值?如果
arr_str
保持
{'a','b','b'}
并且您想添加
{'b','c','d'}
,那么这个数组应该是什么?是的,但我实际上想更新列本身。我不想在更新列之前选择列并创建一个新数组进行更新。我只想使用更新查询。你应该在问题中提到这一点。请更新我的眼睛,但我实际上想更新专栏本身。我不想在更新列之前选择列并创建一个新数组进行更新。我只想使用更新查询。非常感谢。这是我一直在寻找的完美答案。:)不附加到arr_str为的行NULL@ShubhamGupta没有操作将任何内容附加到空值。这是一种观点,因为NULL不是空数组,而是未知数组。如果您将其用于空数组,则必须在集合的where和右侧手动使用
coalesce(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}'