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

PostgreSQL组_conat等效?

PostgreSQL组_conat等效?

明月笑刀无情 2019-06-25 14:27:24
PostgreSQL组_conat等效?我有一个表,我想把每个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 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

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

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

阵列AGG返回数组,但可以将其转换为文本并根据需要进行编辑(请参阅下面的说明)。

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

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

(摘自PostgreSQL文档)

澄清:

  • 将数组转换为文本的结果是,结果字符串以大括号开头和结尾。如果不想要的话,这些大括号需要用某种方法移除。
  • 将ANYARRAY转换为Text,最好将CSV输出模拟为包含嵌入逗号的元素,这些元素在标准CSV样式的输出中双引号。任何数组_to_string()或string_agg()(在9.1中添加的“group_conat”函数)都不会引用带有内嵌逗号的字符串,从而导致结果列表中的元素数不正确。
  • 新的9.1 String_agg()函数不首先将内部结果转换为Text。因此,如果value_field是整数,“string_agg(Value_Field)”将产生错误。“string_agg(value_field:text)”将是必需的。Array_agg()方法只需要在聚合之后进行一次强制转换(而不是按值进行强制转换)。


查看完整回答
反对 回复 2019-06-25
?
幕布斯6054654

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

自9.0以来这就更容易了:

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


查看完整回答
反对 回复 2019-06-25
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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

也一样。


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

添加回答

举报

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