我有一张桌子,我想每个ID都将一行与连接的字段值连接起来。

在我的桌子上,例如,我有这个: />
,我想输出:在这里工作... PostgreSQL是否具有等效功能,或者还有其他方法可以实现此目的?

评论

不是答案,但请查看postgresonline.com/journal/index.php?/archives /...。

stackoverflow.com/questions/1943433/…

SQL Server中模拟group_concat MySQL函数的可能重复项?

我认为最好的答案仍然是另一个问题:stackoverflow.com/a/47638417/243233

#1 楼

这可能是一个很好的起点(仅适用于8.4及更高版本): (如下所示)。

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

说明:


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


评论


在9.0中,您将拥有listagg()

–斯科特·贝利(Scott Bailey)
2010年4月1日于16:55

要获取CSV,查询应为:SELECT id_field,array_to_string(array_agg(value_field1),','),array_to_string(array_agg(value_field2),',')FROM data_table GROUP BY id_field

– Nux
2012-2-16在16:08



您不能在所有情况下都使用array_to_string。如果您的value_field包含嵌入式逗号,则结果CSV不正确。使用array_agg()并强制转换为TEXT会正确引用带有嵌入式逗号的字符串。唯一需要注意的是,它还包括开始和结束花括号,因此我的声明“和根据需要编辑”。我将进行编辑以澄清这一点。

–马修·伍德(Matthew Wood)
2012年2月21日在20:00

仅供参考:这是8.4中array_agg文档的链接

–Michael Rusch
14-4-22在21:35



#2 楼

从9.0开始,这甚至更加容易:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id


评论


请注意,该语法还允许您在字符串(或数组,使用array_agg)中指定值的顺序,例如string_agg(some_column,','按some_column排序)甚至string_agg(surname ||','|| forename,';'ORDER BY姓氏,前称)

–IMSoP
13年5月16日在14:33

出色的与string_agg配合使用,因此可以使用string_agg(distinct some_solumn,',')

–阿伦
18年7月4日在0:33

请注意,如果列值是不可字符串化的值(即uuid),则可能需要将其转换为TEXT。这看起来像string_agg(some_column :: text,',')

–肯德尔
19年9月11日在16:56



如果列类型是整数,请不要忘记转换或使用concat(column,'')进行隐式转换

–塔克曼
10月1日14:48

PS,string_agg(value,',')仅在值是字符串时才能使用。例如,如果该值为整数,则需要将其强制转换为类似value :: character

– ZenithS
11月25日7:19

#3 楼

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


也会做。

评论


是否可以执行此注释中的操作(以特定顺序汇总)?您将如何处理按一列分组并按另一列排序(例如,将纵向数据集中的变量连接起来)?

–迈克尔A
2015年1月8日在18:22



#4 楼

尝试这样:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;


#5 楼

以及适用于数组类型的版本:

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);


评论


重复的答案,@ max_spy在五年前说过同样的话

–埃米尔·维克斯特罗姆(EmilVikström)
19年2月6日在13:12

@EmilVikström:您有权错,但请仔细阅读。这不仅是不同的,而且我举了一个示例,该示例适用于数组类型-就像zip_codes是character changes(5)[]。另外,我已经验证了这一点-不需要嵌套,否则您将看到错误:无法累积不同维数的数组。

–SławomirLenart
19年2月6日在13:47



#6 楼

我在postgresql中的建议

SELECT cpf || ';' || nome || ';' || telefone  
FROM (
      SELECT cpf
            ,nome
            ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
      FROM (
            SELECT DISTINCT * 
            FROM temp_bd 
            ORDER BY cpf DESC ) AS y
      GROUP BY 1,2 ) AS x   


评论


为什么在内部查询中执行ORDER BY?反正订单不会丢失吗?

– mypetlion
18-10-31在18:35

#7 楼

希望下面的Oracle查询能够工作。

Select First_column,LISTAGG(second_column,',') 
    WITHIN GROUP (ORDER BY second_column) as Sec_column, 
    LISTAGG(third_column,',') 
    WITHIN GROUP (ORDER BY second_column) as thrd_column 
FROM tablename 
GROUP BY first_column


评论


我在rextester.com/l/postgresql_online_compiler上对其进行了测试,但无法正常工作:42883:函数listagg(text,unknown,text)不存在

–曼努埃尔·罗梅罗(Manuel Romeiro)
2月4日12:07

Oracle具有与postgres不同的语法和功能。

– Herman J. Radtke III
2月5日下午16:37