我在postgresql上遇到了第一次痛苦的经历,当下的分钟挑战是:
如何在postgresql中执行concat_ws,以通过以下方式从组中连接多个字段值:
select concat_ws(';',field_lambda) from table_lambda group by id;
答案 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').