我第一次使用PostgreSQL,遇到了痛苦的经历,目前的挑战是:
如何在PostgreSQL中执行concat_ws操作,以连接一个group by中多个字段的值:
select concat_ws(';',field_lambda) from table_lambda group by id;
我第一次使用PostgreSQL,遇到了痛苦的经历,目前的挑战是:
如何在PostgreSQL中执行concat_ws操作,以连接一个group by中多个字段的值:
select concat_ws(';',field_lambda) from table_lambda group by id;
对于 PostgreSQL 8.4 及以上版本:
select ARRAY_TO_STRING(
ARRAY_AGG(field_lambda),';'
) from table_lambda group by id;
string_agg()
可以实现您所需的功能:SELECT string_agg(field1, ';') FROM tbl GROUP BY id;
concat_ws()
,在不滥用为聚合函数时与MySQL的concat_ws()
相同。它特别适用于处理NULL
值。SELECT concat_ws(';', field1, field2, field3) FROM tbl
您甚至可以将两者结合起来,以任何您想要的方式汇总多个列。
SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields
FROM tbl
GROUP BY id;
在8.4版本之前没有array_agg
函数,可以使用以下方法:
SELECT array_to_string(
ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';'
);
array_agg
函数,以接近您所需的功能。CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
这适用于:
标签数据必须显示资产有几个,即对于资产6,它有2个标签,将它们显示为1,2
表格如下:
asest_id 1 1 1 6 6
tag_id 1 3 5 1 2
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 ;
对于这个问题进一步的人来说,如果你想支持多列,请使用concat_ws方法,因为这种方法不适用于多列。
ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').
concat_ws()
不是聚合函数。请改用string_agg()
。请参见下文。 - Erwin Brandstetter