为了账号安全,请及时绑定邮箱和手机立即绑定

Postgresql GROUP_CONCAT等价?

Postgresql GROUP_CONCAT等价?

Smart猫小萌 2019-10-13 18:42:41
Postgresql GROUP_CONCAT等价?我有一个表,我想每个id拉一行,并且字段值连接在一起。例如,在我的表中,我有这个:TM67 | 4  | 32556TM67 | 9  | 98200TM67 | 72 | 22300TM99 | 2  | 23009TM99 | 3  | 11200我想输出:TM67 | 4,9,72 | 32556,98200,22300TM99 | 2,3    | 23009,11200在MySQL中,我能够使用聚合函数GROUP_CONCAT,但这似乎在这里不起作用...是否有等效的PostgreSQL,或其他方法来实现这一点?
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

从9.0开始,这更容易:

SELECT id, 
       string_agg(some_column, ',')FROM the_tableGROUP BY id


查看完整回答
反对 回复 2019-10-13
?
狐的传说

TA贡献1804条经验 获得超3个赞

SELECT array_to_string(array(SELECT a FROM b),', ');

也会这样做。


查看完整回答
反对 回复 2019-10-13
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

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

SELECT id_field, array_agg(value_field1), array_agg(value_field2)FROM data_tableGROUP BY id_field

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

在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()方法在聚合后只需要一次强制转换(而不是每个值的强制转换)。



查看完整回答
反对 回复 2019-10-13
  • 3 回答
  • 0 关注
  • 434 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信