2017-04-26 55 views
0

如果非要Postgres的追加或设定的每个元件(如果不是存在)的阵列的一个阵列列

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

然后如何添加此{“B”,“C”,“d” }阵列列arr_str ,这样我就得到以下结果

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

我不想选择列,并创建用于更新的新阵列。我只想用UPDATE查询。

+0

有机会'arr_str' 5月包含重复的值? –

+0

** arr_str **可以保存重复值,但我不想添加重复值 – Prataksha

+0

更新了问题...只想使用**更新**查询 – Prataksha

回答

1

我假设arr_strtext[]型的(虽然你没有使用正确的格式为他们,所以我可能是错的;如果是这样的话,你需要你的价值转换为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}'谓词)。这通常是最佳实践,并且在涉及触发器时几乎总是被推荐。

http://rextester.com/GKS7382

+0

非常感谢。这是我正在寻找的完美答复/答案。 :) – Prataksha

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 
+0

是的,但我其实想要更新列本身。我不想在对列进行更新之前选择列并创建一个新的数组进行更新。我只想使用UPDATE查询。 – Prataksha

+0

你应该在问题中提到这一点。请更新 –

+0

是的,我更新了问题 – Prataksha

0

试试这个代码:

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

是的,但我确实想要更新列本身。我不想在对列进行更新之前选择列并创建一个新的数组进行更新。我只想使用UPDATE查询。 – Prataksha

2

在默认安装的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

相关问题