Postgresql - concat_ws类似的函数是什么?

13

我第一次使用PostgreSQL,遇到了痛苦的经历,目前的挑战是:

如何在PostgreSQL中执行concat_ws操作,以连接一个group by中多个字段的值:

select concat_ws(';',field_lambda) from table_lambda group by id;

3
FYI,concat_ws 函数将出现在 PostgreSQL 9.1 中:http://developer.postgresql.org/pgdocs/postgres/functions-string.html - Peter Eisentraut
1
但在Postgres中,concat_ws()不是聚合函数。请改用string_agg()。请参见下文。 - Erwin Brandstetter
6个回答

17

对于 PostgreSQL 8.4 及以上版本:

select ARRAY_TO_STRING(
    ARRAY_AGG(field_lambda),';'
) from table_lambda group by id;

8
自从 2010 年 9 月发布的 PostgreSQL 9.0 版本以来,有一个聚合函数 string_agg() 可以实现您所需的功能:
SELECT string_agg(field1, ';') FROM tbl GROUP BY id;

请注意,第二个参数是分隔符(类似于其他聚合函数)。
自PostgreSQL 9.1以来,还有字符串函数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;

2

在8.4版本之前没有array_agg函数,可以使用以下方法:

SELECT array_to_string(
    ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';'
);

0
根据PostgreSQL wiki,您可以模拟PostgreSQL 8.4的array_agg函数,以接近您所需的功能。
CREATE AGGREGATE array_agg(anyelement) (
    SFUNC=array_append,
    STYPE=anyarray,
    INITCOND='{}'
);

0

这适用于:

标签数据必须显示资产有几个,即对于资产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 ;


-1

对于这个问题进一步的人来说,如果你想支持多列,请使用concat_ws方法,因为这种方法不适用于多列。

ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接