我第一次有了使用postgresql的痛苦经历,现在的挑战是:如何在postgresql中执行concat_ws,将多个字段值从一个组中连接起来:
select concat_ws(';',field_lambda) from table_lambda group by id;
字符串
58wvjzkj1#
对于PostgreSQL 8.4及以上版本:
select ARRAY_TO_STRING( ARRAY_AGG(field_lambda),';' ) from table_lambda group by id;
zazmityj2#
Postgres9.0为作业添加了聚合函数string_agg():
string_agg()
SELECT string_agg(field1, ';') FROM tbl GROUP BY id;
字符串第二个参数是分隔符(类似于其他聚合函数)。请参阅:
字符串函数**concat_ws()**(Postgres 9.1+)的作用与MySQL的concat_ws()相同-当不被滥用为聚合函数时。它在处理空值时特别有用:
concat_ws()
SELECT concat_ws(';', field1, field2, field3) FROM tbl
型您甚至可以合并来聚合多个列:
SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields FROM tbl GROUP BY id;
型
92dk7w1h3#
如果没有array_agg(8.4之前),您可以用途:
array_agg
SELECT array_to_string( ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';' );
4smxwvx54#
根据PostgreSQL wiki,你可以模拟PostgreSQL 8.4 array_agg函数来接近你所需要的。
CREATE AGGREGATE array_agg(anyelement) ( SFUNC=array_append, STYPE=anyarray, INITCOND='{}' );
lnlaulya5#
这适用于;标签数据必须显示资产有几个,也就是说,对于资产6,它有2个标签,显示它们1,2是表:电话:+86-021 - 8888888电话:+86-0511 - 8888888传真:+86-0511 - 8888888SELECT asset_tag.asset_id,asset_tag.tag_id,concat_ws(',',asset_tag.tag_id,asset_tag.tag_id)AS etiquetaFROM public.asset_tag--JOIN PUBLIC.imagen ON asset_tag.asset_id = imagen.asset_id--WHERE imagen.asset_id = asset_tag.asset_idGROUP BY asset_tag.asset_id,asset_tag.tag_id ;
iih3973s6#
如果你想支持多个列的使用,这个方法将不能处理多个列(就像concat_ws一样)
ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').
6条答案
按热度按时间58wvjzkj1#
对于PostgreSQL 8.4及以上版本:
字符串
zazmityj2#
Postgres9.0为作业添加了聚合函数
string_agg()
:字符串
第二个参数是分隔符(类似于其他聚合函数)。
请参阅:
字符串函数**
concat_ws()
**(Postgres 9.1+)的作用与MySQL的concat_ws()
相同-当不被滥用为聚合函数时。它在处理空值时特别有用:型
您甚至可以合并来聚合多个列:
型
92dk7w1h3#
如果没有
array_agg
(8.4之前),您可以用途:字符串
4smxwvx54#
根据PostgreSQL wiki,你可以模拟PostgreSQL 8.4
array_agg
函数来接近你所需要的。字符串
lnlaulya5#
这适用于;标签数据必须显示资产有几个,也就是说,对于资产6,它有2个标签,显示它们1,2是表:
电话:+86-021 - 8888888
电话:+86-0511 - 8888888传真:+86-0511 - 8888888
SELECT asset_tag.asset_id,asset_tag.tag_id,concat_ws(',',asset_tag.tag_id,asset_tag.tag_id)AS etiqueta
FROM public.asset_tag
--JOIN PUBLIC.imagen ON asset_tag.asset_id = imagen.asset_id
--WHERE imagen.asset_id = asset_tag.asset_id
GROUP BY asset_tag.asset_id,asset_tag.tag_id ;
iih3973s6#
如果你想支持多个列的使用,这个方法将不能处理多个列(就像concat_ws一样)
字符串