У меня первый болезненный опыт работы с postgresql, и минутный вызов момента:
Как выполнить concat_ws в postgresql, чтобы объединить несколько значений полей из группы:
select concat_ws(';',field_lambda) from table_lambda group by id;
У меня первый болезненный опыт работы с postgresql, и минутный вызов момента:
Как выполнить concat_ws в postgresql, чтобы объединить несколько значений полей из группы:
select concat_ws(';',field_lambda) from table_lambda group by id;
Для PostgreSQL 8.4 и выше:
select ARRAY_TO_STRING(
ARRAY_AGG(field_lambda),';'
) from table_lambda group by id;
Так как PostgreSQL 9.0 (выпущен в сентябре 2010 г.), существует агрегатная функция
string_agg()
делать то, что вам кажется нужным:
SELECT string_agg(field1, ';') FROM tbl GROUP BY id;
Обратите внимание, что вторым параметром является разделитель (аналогично другим агрегатным функциям).
Существует также строковая функция concat_ws()
с PostgreSQL 9.1, что в противном случае это будет делать так же, как MySQL concat_ws()
(если не злоупотреблять как функция агрегата). Это особенно полезно для обработки значений NULL
.
SELECT concat_ws(';', field1, field2, field3) FROM tbl
Вы даже можете объединить оба, чтобы aggreagate несколько столбцов, как вам угодно.
SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields
FROM tbl
GROUP BY id;
Без array_agg
(до 8.4) вы можете использовать:
SELECT array_to_string(
ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';'
);
Согласно PostgreSQL wiki, вы можете эмулировать функцию PostgreSQL 8.4 array_agg
, чтобы приблизиться к тому, что вам нужно.
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
Другие люди, приходящие сюда для этой проблемы, этот метод не будет работать с несколькими столбцами (например, concat_ws), если вы хотите поддерживать несколько колонок, используйте
ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').