Jak działa STRING_AGG w języku SQL? Przykłady zastosowania

Jak działa STRING_AGG w języku SQL? Przykłady zastosowania

STRING_AGG to jedna z tych funkcji w SQL, która może znacząco ułatwić życie każdemu, kto pracuje z danymi tekstowymi. Jeśli kiedykolwiek musiałeś połączyć wartości z kilku wierszy w jednej kolumnie w jedną całość, wiesz, jak uciążliwe może być stosowanie do tego celu starych metod. Właśnie w takich sytuacjach przydaje się STRING_AGG.

Czym jest STRING_AGG i jak działa?

STRING_AGG to funkcja agregująca dostępna w SQL Server (od wersji 2017) i PostgreSQL. Jej głównym zadaniem jest łączenie wielu wartości (ciągów znaków z różnych wierszy) w jeden ciąg, przy użyciu określonego separatora.

Ogólna składnia funkcji wygląda tak:

STRING_AGG(wyrażenie, separator) [WITHIN GROUP (ORDER BY kolumna ASC/DESC)]
  • wyrażenie – kolumna lub wartość, którą chcemy połączyć.
  • separator – znak lub ciąg znaków, który będzie rozdzielać połączone wartości.
  • ORDER BY (opcjonalne) – pozwala określić kolejność łączenia wartości.

Prosty przykład zastosowania STRING_AGG

Załóżmy, że mamy tabelę Uzytkownicy z następującymi danymi:

ID Imie Miasto
1 Jan Warszawa
2 Anna Kraków
3 Piotr Warszawa

Chcemy uzyskać listę imion użytkowników poszczególnych miast w formie jednego łańcucha. Możemy to zrobić tak:

SELECT Miasto, STRING_AGG(Imie, ', ') AS Lista_Imion
FROM Uzytkownicy
GROUP BY Miasto;

Wynik zapytania:

Miasto Lista_Imion
Warszawa Jan, Piotr
Kraków Anna

Zmiana kolejności wyników za pomocą ORDER BY

STRING_AGG pozwala również kontrolować kolejność łączenia danych. Jeśli chcemy posortować imiona alfabetycznie w ramach grupy, możemy użyć WITHIN GROUP (ORDER BY ...):

SELECT Miasto, 
    STRING_AGG(Imie, ', ') WITHIN GROUP (ORDER BY Imie ASC) AS Lista_Imion
FROM Uzytkownicy
GROUP BY Miasto;

Teraz lista imion dla Warszawy będzie posortowana w kolejności: Jan, Piotr.

STRING_AGG w PostgreSQL

W PostgreSQL funkcja STRING_AGG działa bardzo podobnie, ale zapisy wygląda nieco inaczej:

SELECT Miasto, 
    STRING_AGG(Imie, ', ' ORDER BY Imie ASC) AS Lista_Imion
FROM Uzytkownicy
GROUP BY Miasto;

W przypadku PostgreSQL kolejność sortowania jest określana bezpośrednio w wywołaniu STRING_AGG bez dodatkowej klauzuli WITHIN GROUP.

Obsługa wartości NULL

Jeśli tabela zawiera wartości NULL, STRING_AGG domyślnie je ignoruje. Na przykład:

INSERT INTO Uzytkownicy (ID, Imie, Miasto) VALUES (4, NULL, 'Warszawa');

Zapytanie:

SELECT Miasto, STRING_AGG(Imie, ', ') AS Lista_Imion
FROM Uzytkownicy
GROUP BY Miasto;

Ignoruje NULL i zwraca tylko dostępne wartości.

Zastosowanie w praktyce

STRING_AGG jest bardzo przydatny w:

  • Generowaniu raportów, gdzie dane powinny być zwracane w jednym polu.
  • Tworzeniu listy tagów lub kategorii dla użytkowników.
  • Zagnieżdżaniu połączonych wartości w JSON lub XML.

Podsumowanie

STRING_AGG to potężna funkcja, która pozwala w prosty sposób połączyć wiele wartości w jeden ciąg znaków. Jest dużo bardziej czytelna i wydajna niż wcześniejsze metody bazujące na XML PATH czy łączeniu STRING + COALESCE. Dzięki obsłudze sortowania wyników oraz ignorowania wartości NULL, można dopasować jej działanie do konkretnych potrzeb. Jeśli jeszcze jej nie używasz – zdecydowanie warto ją poznać!

 

Inny ciekawy artykuł:

Jak działa MAX w języku SQL? Przykłady zastosowania

KajoDataSpace