Эквивалент КОНКАТА группы Postgresql?
у меня есть таблица, и я хотел бы вытащить одну строку на id с Объединенными значениями полей.
В моей таблице, например, у меня есть это:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
и я хотел бы вывести:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
в MySQL я смог использовать агрегатную функцию GROUP_CONCAT
, но это, похоже, не работает здесь... Есть ли эквивалент для PostgreSQL или другой способ сделать это?
4 ответов
это, вероятно, хорошая отправная точка (только версия 8.4+):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg возвращает массив, но вы можете привести его к тексту и редактировать по мере необходимости (см. пояснения ниже).
до версии 8.4, вы должны определить его самостоятельно перед использованием:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(перефразировано из документации PostgreSQL)
пояснения:
- результатом приведения массива к тексту является то, что результирующая строка начинается и заканчивается фигурными скобками. Эти брекеты нужно удалить каким-то способом, если они не нужны.
- приведение ANYARRAY к тексту лучше всего имитирует вывод CSV, поскольку элементы, содержащие встроенные запятые, дважды цитируются в выводе в стандартном стиле CSV. Ни array_to_string() , ни string_agg () (функция "group_concat" добавлена в 9.1) строки кавычек со встроенными запятыми, что приводит к неправильному количеству элементов в результате список.
- новая функция 9.1 string_agg () сначала не приводит внутренние результаты к тексту. Таким образом," string_agg(value_field) " будет генерировать ошибку, если value_field является целым числом. "string_agg(value_field::text)" будет обязательным. Метод array_agg () требует только одного приведения после агрегации (а не приведения на значение).
С 9.0 это еще проще:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id