Някои RDBMS като MySQL и MariaDB имат GROUP_CONCAT()
функция, която ви позволява да върнете колона на заявка като разделен списък (например списък, разделен със запетая).
PostgreSQL има подобна функция, наречена STRING_AGG()
. Тази функция работи почти по същия начин като GROUP_CONCAT()
работи в MySQL и MariaDB.
Пример
Ето основен пример, за да демонстрирате как STRING_AGG()
на PostgreSQL функция работи:
SELECT STRING_AGG(genre, ',') FROM Genres;
Резултат:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Ето какво се случва, когато просто направим заявката без STRING_AGG()
функция:
SELECT genre FROM Genres;
Резултат:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Получаваме осем реда, всеки с отделна стойност, вместо един дълъг ред, разделен със запетая, от всички стойности.
Ако не друго, STRING_AGG()
на PostgreSQL е по-скоро като GROUP_CONCAT()
на MySQL отколкото едноименната функция на MariaDB. Казвам това, защото GROUP_CONCAT()
на MariaDB ни позволява да предоставим LIMIT
клауза (от MariaDB 10.3.3), направо от самата функция. MySQL GROUP_CONCAT()
не поддържа LIMIT
клауза, както и STRING_AGG()
на PostgreSQL функция (поне не към момента на писане).
Друга разлика е, че STRING_AGG()
на PostgreSQL изисква втори аргумент (който определя разделителя за използване). И MySQL, и MariaDB правят това по избор със своя GROUP_CONCAT()
функции.
STRING_AGG()
на Postgres приема ORDER BY
клауза и DISTINCT
клауза (както и GROUP_CONCAT()
на MariaDB и MySQL функции).
Вижте STRING_AGG()
Функция в PostgreSQL за повече примери.
И в случай, че се интересувате, SQL Server също има STRING_AGG()
функция, която работи почти по същия начин.