Postgresql - concat_ws как функция?

У меня первый болезненный опыт работы с postgresql, и минутный вызов момента:

Как выполнить concat_ws в postgresql, чтобы объединить несколько значений полей из группы:

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

Ответ 1

Для PostgreSQL 8.4 и выше:

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

Ответ 2

Так как 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;

Ответ 3

Без array_agg (до 8.4) вы можете использовать:

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

Ответ 4

Согласно PostgreSQL wiki, вы можете эмулировать функцию PostgreSQL 8.4 array_agg, чтобы приблизиться к тому, что вам нужно.

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

Ответ 5

Другие люди, приходящие сюда для этой проблемы, этот метод не будет работать с несколькими столбцами (например, concat_ws), если вы хотите поддерживать несколько колонок, используйте

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