如果非要Postgres的追加或设定的每个元件(如果不是存在)的阵列的一个阵列列
select arr_str from tabl1;
-> {'a', 'b'}
然后如何添加此{“B”,“C”,“d” }阵列列arr_str ,这样我就得到以下结果
select arr_str from tabl1;
-> {'a', 'b', 'c', 'd'}
我不想选择列,并创建用于更新的新阵列。我只想用UPDATE查询。
如果非要Postgres的追加或设定的每个元件(如果不是存在)的阵列的一个阵列列
select arr_str from tabl1;
-> {'a', 'b'}
然后如何添加此{“B”,“C”,“d” }阵列列arr_str ,这样我就得到以下结果
select arr_str from tabl1;
-> {'a', 'b', 'c', 'd'}
我不想选择列,并创建用于更新的新阵列。我只想用UPDATE查询。
我假设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}'
谓词)。这通常是最佳实践,并且在涉及触发器时几乎总是被推荐。
非常感谢。这是我正在寻找的完美答复/答案。 :) – Prataksha
可以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
试试这个代码:
select array(select distinct unnest(string_to_array('a,b',',') || string_to_array('b,c,d',',')) order by 1)
是的,但我确实想要更新列本身。我不想在对列进行更新之前选择列并创建一个新的数组进行更新。我只想使用UPDATE查询。 – Prataksha
在默认安装的PG你可以合并两个数组与||运营商:
select arr_str || '{a, b}' from tabl1
但在这种情况下,你会得到重复。
为了避免它们,您可以UNNEST数组行集和独特的那样:
select ARRAY(SELECT DISTINCT UNNEST(arr_str || '{a,b,c}')) from tabl1
如果你的价值观是整数,有更优雅的方式来获得与inrarray的contrib模块的uniq uniq的数组值()功能: https://www.postgresql.org/docs/current/static/intarray.html
有机会'arr_str' 5月包含重复的值? –
** arr_str **可以保存重复值,但我不想添加重复值 – Prataksha
更新了问题...只想使用**更新**查询 – Prataksha