小编典典

Postgresql GROUP_CONCAT是否等效?

sql

我有一张桌子,我想将每个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是否具有等效功能,或者还有另一种方法可以实现此目的?


阅读 183

收藏
2021-05-05

共1个答案

小编典典

这可能是一个很好的起点(仅限8.4+版本):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_agg返回一个数组,但是您可以根据需要对其进行文本转换和编辑(请参见下面的说明)。

在版本8.4之前,您必须在使用前自行定义:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

(摘自PostgreSQL文档)

说明:

  • 将数组强制转换为文本的结果是,结果字符串以大括号开头和结尾。如果不需要,则需要通过某些方法将其除去。
  • 将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()方法在聚合之后只需要进行一次强制转换(而不是按值强制转换)。
2021-05-05