Postgresql GROUP_CONCAT是否等效? [英] Postgresql GROUP_CONCAT equivalent?

查看:96
本文介绍了Postgresql GROUP_CONCAT是否等效?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张桌子,我想为每个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆