Niektóre RDBMS, takie jak MySQL i MariaDB, mają funkcję GROUP_CONCAT()
funkcja, która pozwala zwrócić kolumnę zapytania jako listę rozdzielaną (na przykład listę rozdzielaną przecinkami).
PostgreSQL ma podobną funkcję o nazwie STRING_AGG()
. Ta funkcja działa w podobny sposób jak GROUP_CONCAT()
działa w MySQL i MariaDB.
Przykład
Oto podstawowy przykład pokazujący, jak STRING_AGG()
w PostgreSQL funkcja działa:
SELECT STRING_AGG(genre, ',') FROM Genres;
Wynik:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Oto, co się dzieje, gdy wykonujemy zapytanie bez STRING_AGG()
funkcja:
SELECT genre FROM Genres;
Wynik:
+---------+ | genre | +---------+ | Rock | | Jazz | | Country | | Pop | | Blues | | Hip Hop | | Rap | | Punk | +---------+ (8 rows)
Otrzymujemy osiem wierszy, każdy z osobną wartością, zamiast jednego wiersza oddzielonego przecinkami wszystkich wartości.
Jeśli już, to STRING_AGG()
w PostgreSQL bardziej przypomina GROUP_CONCAT()
w MySQL niż funkcja MariaDB o tej samej nazwie. Mówię to, ponieważ GROUP_CONCAT()
MariaDB pozwala nam zapewnić LIMIT
(od MariaDB 10.3.3), bezpośrednio z samej funkcji. MySQL GROUP_CONCAT()
nie obsługuje LIMIT
klauzula, podobnie jak STRING_AGG()
w PostgreSQL funkcja (przynajmniej nie w chwili pisania tego tekstu).
Kolejną różnicą jest to, że STRING_AGG()
w PostgreSQL wymaga drugiego argumentu (który określa separator do użycia). Zarówno MySQL, jak i MariaDB czynią to opcjonalnym za pomocą ich GROUP_CONCAT()
funkcje.
STRING_AGG()
Postgresa akceptuje ORDER BY
klauzula i DISTINCT
klauzula (podobnie jak w MariaDB i MySQL GROUP_CONCAT()
funkcje).
Zobacz STRING_AGG()
Funkcja w PostgreSQL, aby uzyskać więcej przykładów.
A jeśli jesteś zainteresowany, SQL Server ma również funkcję STRING_AGG()
funkcja, która działa w bardzo podobny sposób.