在我的桌子上,例如,我有这个: />
,我想输出:在这里工作... PostgreSQL是否具有等效功能,或者还有其他方法可以实现此目的?
#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
评论
不是答案,但请查看postgresonline.com/journal/index.php?/archives /...。stackoverflow.com/questions/1943433/…
SQL Server中模拟group_concat MySQL函数的可能重复项?
我认为最好的答案仍然是另一个问题:stackoverflow.com/a/47638417/243233