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 .. 但在 Postgresconcat_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()
,否则它的作用与 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;
【讨论】:
以上是关于Postgresql - concat_ws 之类的功能?的主要内容,如果未能解决你的问题,请参考以下文章
一条SQL引发系统out of memory PostgreSQL