Prosta konkatenacja napisów w wierszach według ustalonej kolejności (2017+)

 STRING_AGG()   to długo wyczekiwana funkcja. Konkurencja miała już ją od dawna. A my musieliśmy kombinować i stawiać protezy (recursive cte, xml, clr, meh..)

SQL Server 2017 (i Azure) nam wreszcie ją udostępnia. Warto jednak pamiętać, że domyślnie napisy złączane są według kolejności losowej (takiej, z jaką „wpadną w ręce” silnika), sterować zaś nią można przy użyciu polecenia WITHIN GROUP .

Poniżej prosty przykład z separatorem spacji (który oczywiście nie doklei się po ostatniej wartości).

Tworzymy prostą tabelę i wrzucamy do niej słowa w losowej kolejności:

CREATE TABLE #TEST
(
    id TINYINT IDENTITY PRIMARY KEY,
    napis NVARCHAR(50),
    kolejnosc TINYINT
);


/*
Ala - 1
ma - 2
kota - 3
kot - 4
ma - 5
Alę - 6
*/

INSERT #TEST
(
    napis,
    kolejnosc
)
VALUES
(N'ma', 5),
(N'kot', 4),
(N'ma', 2),
(N'Alę', 6),
(N'Ala', 1),
(N'kota,', 3);

 

Uruchomienie SELECT * FROM #TEST;  naturalnie pokaże nam kolejność zgodną z indeksem klastrowym (który jest taki sam jak klucz główny)

Złączenie napisów również po PK:

SELECT abc = STRING_AGG(napis, ' ')
FROM #TEST

Natomiast użycie WITHIN zadziała zgodnie z oczekiwaniami 🙂

SELECT 
	abc = STRING_AGG(napis,' ') 
	WITHIN GROUP (ORDER BY kolejnosc ASC) 
	FROM #TEST

 

Proste, a cieszy ;]

Dodaj komentarz