Postgresql GROUP_CONCAT相当于?
我有一个表,我想每个ID拉字段值连接一行。
例如,在我的桌子上,我有这个:
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,或另一种方式来实现呢?
这可能是一个很好的起点(仅版本8.4+):
SELECT id_field, array_agg(value_field1), array_agg(value_field2) FROM data_table GROUP BY id_field
array_agg返回一个数组,但是你可以将CAST转换为文本并根据需要进行编辑(参见下面的说明)。
在版本8.4之前,你必须在使用之前自己定义它:
CREATE AGGREGATE array_agg (anyelement) ( sfunc = array_append, stype = anyarray, initcond = '{}' );
(从PostgreSQL文档转述)
澄清:
- 将数组转换为文本的结果是生成的字符串以花括号开始和结束。 这些大括号需要通过某种方法删除,如果他们不需要。
- 将ANYARRAY投射到TEXT最能模拟CSV输出,因为包含嵌入逗号的元素在标准CSV样式的输出中被双引号引用。 在9.1中添加了引用带有嵌入逗号的字符串array_to_string()或string_agg()(“group_concat”函数),导致结果列表中的元素数量不正确。
- 新的9.1 string_agg()函数不会先将内部结果转换为TEXT。 所以如果value_field是一个整数,那么“string_agg(value_field)”会产生一个错误。 “string_agg(value_field :: text)”将是必需的。 array_agg()方法在聚合之后只需要一次强制转换(而不是每个值强制转换)。
从9.0开始,这更容易:
SELECT id, string_agg(some_column, ',') FROM the_table GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');
会做得很好。
尝试像这样:
select field1, array_to_string(array_agg(field2), ',') from table1 group by field1;