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

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

12 голосов
/ 22 декабря 2009

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

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

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

Ответы [ 5 ]

16 голосов
/ 22 декабря 2009

Для PostgreSQL 8.4 и выше:

select ARRAY_TO_STRING(
    ARRAY_AGG(field_lambda),';'
) from table_lambda group by id;
6 голосов
/ 12 апреля 2013

Поскольку 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

Вы можете даже объединить оба, чтобы объединить несколько столбцов любым способом.

SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields
FROM   tbl
GROUP  BY id;
2 голосов
/ 26 декабря 2009

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

SELECT array_to_string(
    ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';'
);
0 голосов
/ 07 декабря 2015

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

ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter').
0 голосов
/ 09 апреля 2011

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

CREATE AGGREGATE array_agg(anyelement) (
    SFUNC=array_append,
    STYPE=anyarray,
    INITCOND='{}'
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...