Postgresql GROUP_CONCAT是否等效? [英] Postgresql GROUP_CONCAT equivalent?
问题描述
我有一张桌子,我想为每个ID提取一行并连接字段值.
I have a table and I'd like to pull one row per id with field values concatenated.
例如,在我的桌子上,我有这个:
In my table, for example, I have this:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
我想输出:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
在MySQL中,我可以使用聚合函数GROUP_CONCAT
,但这似乎在这里不起作用... PostgreSQL是否具有等效功能,或者有另一种方法可以实现此目的?
In MySQL I was able to use the aggregate function GROUP_CONCAT
, but that doesn't seem to work here... Is there an equivalent for PostgreSQL, or another way to accomplish this?
推荐答案
这可能是一个很好的起点(仅限8.4+版本):
This is probably a good starting point (version 8.4+ only):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg 返回一个数组,但是您可以声明根据需要发送文本和进行编辑(请参见下面的说明).
array_agg returns an array, but you can CAST that to text and edit as needed (see clarifications, below).
在8.4版之前,您必须在使用前自行定义:
Prior to version 8.4, you have to define it yourself prior to use:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(从PostgreSQL文档改写)
(paraphrased from the PostgreSQL documentation)
说明:
- 将数组强制转换为文本的结果是,结果字符串以大括号开头和结尾.如果不需要,则需要通过某些方法将其除去.
- 将ANYARRAY投射到TEXT可以最好地模拟CSV输出,因为包含嵌入逗号的元素在标准CSV样式的输出中被双引号引起来. array_to_string()或string_agg()(在9.1中添加了"group_concat"函数)都没有引用带有嵌入式逗号的字符串,从而导致结果列表中元素的数量不正确.
- 新的9.1 string_agg()函数不会将内部结果首先转换为TEXT.因此,如果value_field为整数,则"string_agg(value_field)"会产生错误.将需要"string_agg(value_field :: text)".聚合后,array_agg()方法只需要进行一次强制转换(而不是按值强制转换).
这篇关于Postgresql GROUP_CONCAT是否等效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!