(В январе 2010 г. команда разработчиков решила, что следующая версия PostgreSQL будет нумероваться 9.0, а не 8.5)
1 февраля Takahiro Itagaki применил патч от Pavel Stehule, который добавляет агрегат string_agg:
Добавляет агрегатные функции string_agg. Версия с одним аргументом конкатенирует входные значения в строку, с двумя аргументами то же самое, но ещё добавляет разделитель между элементами.
Патч от Pavel Stehule, проверен David E. Wheeler и мной.
В общем всё очень просто:
# select string_agg(x) from ( values ('d'), ('e'), ('p'), ('e'), ('s'), ('z') ) as t (x);
string_agg
------------
depesz
(1 row)
или
# select string_agg( relname, ', ' ) from (select relname from pg_class where relkind = 'r' limit 5 )x;
string_agg
--------------------------------------------------------------------
pg_statistic, pg_type, pg_attribute, x, active_threads_by_forum_id
(1 row)
Идея в общем не нова - я предлагал (извините, английской версии нет, только польская) одно решение в 2006. Потом появился array_agg - агрегат, который формирует массив, в сочетании с array_to_string делающий то же самое.
Что интересно в новинке - это скорость.
David Wheeler представил сравнительный тест с array_to_string(array_agg) на определённом наборе данных:
array_to_string(array_agg) – 1365.382 ms
string_agg – 17.989 ms
Это очень здорово.
1 comment:
Nice Article !
This is my pleasure to read your article.
Really this will help to people of PostgreSQL Community.
I have also prepared one article about, Concat string per each group using PostgreSQL string_agg().
You can also visit my article, your comments and reviews are most welcome.
http://www.dbrnd.com/2016/09/postgresql-string_agg-to-concatenate-string-per-each-group-like-sql-server-stuff-string-aggregation-function/
Post a Comment