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}'