Postgresql - concat_ws喜欢的功能?

时间:2009-12-22 00:04:22

标签: postgresql

我在postgresql上遇到了第一次痛苦的经历,当下的分钟挑战是:

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

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

5 个答案:

答案 0 :(得分:16)

对于PostgreSQL 8.4及以上版本:

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

答案 1 :(得分:6)

由于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;

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

根据PostgreSQL wiki,您可以模拟PostgreSQL 8.4 array_agg函数以接近您需要的内容。

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

答案 4 :(得分:-1)

如果你想支持多个列使用

,这个方法对于这个问题来说,这个方法不适用于多个列(如concat_ws)
ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').