Postgresql - concat_ws 之类的功能?

Posted

技术标签:

【中文标题】Postgresql - concat_ws 之类的功能?【英文标题】:Postgresql - concat_ws like function? 【发布时间】:2010-12-28 22:38:36 【问题描述】:

我对 postgresql 有了第一次痛苦的体验,而当下的挑战是:

如何在 postgresql 中执行concat_ws,以通过以下方式连接组中的多个字段值:

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

【问题讨论】:

仅供参考,concat_ws 将在 PostgreSQL 9.1 中:developer.postgresql.org/pgdocs/postgres/functions-string.html .. 但在 Postgres concat_ws()不是 聚合函数。请改用string_agg()。见下文。 【参考方案1】:

更多人来这里解决这个问题,如果你想支持多列使用,这种方法将不适用于多列(如 concat_ws 那样)

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

【讨论】:

【参考方案2】:

根据PostgreSQL wiki,你可以模拟PostgreSQL 8.4的array_agg函数来接近你所需要的。

CREATE AGGREGATE array_agg(anyelement) (
    SFUNC=array_append,
    STYPE=anyarray,
    INITCOND=''
);

【讨论】:

【参考方案3】:

对于 PostgreSQL 8.4 及更高版本:

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

【讨论】:

【参考方案4】:

没有array_agg(8.4之前),可以使用:

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

【讨论】:

【参考方案5】:

从PostgreSQL 9.0(2010年9月发布)开始,就有了聚合函数 string_agg() 做你想做的事:

SELECT string_agg(field1, ';') FROM tbl GROUP BY id;

注意,第二个参数是分隔符(类似于其他聚合函数)。

自 PostgreSQL 9.1 以来还有字符串函数 concat_ws(),否则它的作用与 mysqlconcat_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;

【讨论】:

以上是关于Postgresql - concat_ws 之类的功能?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSql生成数据字典

HSQLDB 有 PostgreSQL 之类的扩展吗?

一条SQL引发系统out of memory PostgreSQL

如何将“ALTER table [...] ADD column”之类的更改记录到我的 PostgreSQL 表中?

concat和concat_ws

mysql中concat_ws()函数