postgresql:聚合文本数组

时间:2013-05-22 02:09:02

标签: postgresql

我希望在此示例数据中获取与每个id相关联的所有单词的数组:

id | words
---|------------------
1  | {foo,bar,zap,bing}
2  | {foo}
1  | {bar,zap}
2  | {bing}
1  | {bing}
2  | {foo,bar}

输出:

id | allwords
---|--------------------------------
1  | {foo,bar,zap,bing,bar,zap,bing}
2  | {foo,bing,foo,bar}

我尝试使用array_agg(words),但它产生了:

ERROR: could not find array type for data type text[]

这里有什么正确的方法?我想要所有的单词,甚至是重复的单词。

2 个答案:

答案 0 :(得分:5)

array_agg将列的结果收集到数组中;它没有聚合数组。

array_cat是您想要的功能,但它不是一个集合功能。

要根据它定义自己的聚合,请使用以下代码:

CREATE AGGREGATE array_cat_aggregate (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = '{}'
);

我公然抄袭了这个答案:https://stackoverflow.com/a/11763245/1394393。 (我不认为这个问题是重复的。)

假装该表名为temp,然后您可以选择使用GROUP BY的函数:

SELECT id, array_cat_aggregate(words)
FROM temp
GROUP BY id;

这里有一个SQL小提琴:http://sqlfiddle.com/#!12/7c828/1/0

答案 1 :(得分:2)

作为jpmc26解决方案的替代方案,您还可以将array_aggunnest数组的子查询结合使用:

SELECT id, array_agg(w) AS allwords
FROM
(
  SELECT
   id,
   unnest(words) AS w
  FROM words_table
) x
GROUP BY id;

Working Fiddle