Започвайки със SQL Server 2017, вече можете да направите резултатите от заявката си да се показват като списък. Това означава, че можете да накарате вашия набор от резултати да се показва като списък, разделен със запетая, списък, разделен с интервал или какъвто разделител изберете да използвате.
Въпреки че е вярно, че бихте могли да постигнете същия ефект преди SQL Server 2017, това беше малко трудно.
Transact-SQL вече има STRING_AGG()
функция, която конкатенира стойностите на низови изрази и поставя стойности на разделители между тях. Това работи почти по същия начин като GROUP_CONCAT()
на MySQL функция.
Тази статия предоставя примери, които демонстрират T-SQL STRING_AGG()
функция.
Примерни данни
Първо, ето някои примерни данни.
ИЗБЕРЕТЕ TaskId, TaskName FROM Tasks;
Резултат:
TaskId TaskName ------ ------------1 Хранете котки 2 Водно куче 3 Хранете градина 4 Боядисвайте килим5 Почистете покрив 6 Хранете котки
Пример – Списък, разделен със запетая
Така че можем да вземем горните данни и да използваме STRING_AGG()
функция за изброяване на всички имена на задачи в един голям списък, разделен със запетая.
Като това:
ИЗБЕРЕТЕ STRING_AGG(TaskName, ', ') ОТ Задачи;
Резултат:
Хранете котки, Водно куче, Хранете градина, Боядисвайте килим, Чист покрив, Хранете котки
Разбира се, не е задължително да се разделя със запетая. Тя може да бъде разделена с произволен израз на NVARCHAR
или VARCHAR
тип и може да бъде литерал или променлива.
Пример – Комбиниране на колони
Можем също да използваме CONCAT()
функция за комбиниране на две полета заедно, разделени със собствен разделител.
Пример:
ИЗБЕРЕТЕ STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ') FROM Tasks;
Резултат:
1) Хранете котки 2) Водно куче 3) Хранете градина 4) Боядисвайте килим 5) Почистете покрив 6) Хранете котки
Пример – нулеви стойности
Ако вашият резултатен набор съдържа нулеви стойности, тези стойности се игнорират и не се добавя съответен разделител.
Ако това не е подходящо, можете да предоставите стойност за нулеви стойности, като използвате ISNULL()
функция и подаване на стойността, която искате да използвате, когато се срещне нулева стойност. Това гарантира, че все още получавате резултат, когато ред съдържа нулева стойност.
Например, помислете за следната заявка и набор от резултати:
ИЗБЕРЕТЕ TaskCode ОТ задачи;
Резултат:
TaskCode--------cat123 null null pnt456 rof789 null
Можем да видим, че има три нулеви стойности в резултатния набор.
Ако изпълним това чрез STRING_AGG()
функция, получаваме това:
ИЗБЕРЕТЕ STRING_AGG(TaskCode, ',') ОТ Задачи;
Резултат:
cat123, pnt456, rof789
Ако обаче използваме ISNULL()
функция за предоставяне на заместител за всякакви нулеви стойности, получаваме това:
ИЗБЕРЕТЕ STRING_AGG(ISNULL(TaskCode, 'N/A'), ',') ОТ Задачи;
Резултат:
cat123, N/A, N/A, pnt456, rof789, N/A
Пример – групирани резултати
Можете също да използвате STRING_AGG()
функция при групиране на вашия набор от резултати. Например, може да искате списък с албуми, групирани по изпълнител.
За да демонстрирате това, представете си база данни с две таблици; Artists
и Albums
. Между тези таблици има връзка едно към много. За всеки изпълнител може да има много албуми.
Така че обикновената заявка, свързваща двете таблици, може да изглежда така:
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ ar.ArtistName, al.AlbumNameFROM Изпълнители arINNER ПРИСЪЕДИНЕТЕ се Албуми alON ar.ArtistId =al.ArtistId;
Резултат:
Име на изпълнител Име на албум ------------------------- -------------------- ----Iron Maiden Powerslave AC/DC Powerage Jim Reeves пее Down the Lane Devin Townsend Ziltoid the Omniscient Devin Townsend Жертви на Cool Devin Townsend Epicloud Iron Maiden Някъде във времето Iron Maiden Piece of Mind Iron Maiden Killers Iron Maiden No Prayer за Dying No Prayer Сценарият No Sound Without SilenceBuddy Rich Big Swing Face Майкъл се научава да рока синя нощ Майкъл се научава да рок вечност Майкъл се научава да рок Скандинавия Том Джоунс отдавна изгубен куфар Том Джоунс Хвали и обвинява Том Джоунс Дойде Джоунс Алън Холдсуърт Цяла нощ Грешен Алън Холдсуърт Шестнадесетте мъже от Тейн
Както можете да видите, ако изпълнител има повече от един албум, името на изпълнителя се посочва няколко пъти – по веднъж за всеки албум.
Но можем да използваме STRING_AGG()
за да промените това, така че да изброим всеки изпълнител само веднъж, последван от разделен със запетая списък с албумите, които са издали:
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ ar.ArtistName, STRING_AGG(al.AlbumName, ', ')ОТ ИЗПЪЛНИТЕЛИ arINNER ПРИСЪЕДИНЕТЕ СЕ Албуми alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;
Резултат:
Име на изпълнител ------------------------- --------------------------- -------------------------------------------------- ------- AC/DC Powerage Алън Холдсуърт цяла нощ грешна, Шестнадесетте мъже от Tain, Бъди Рич Голямо люлеещо се лице Девин Таунсенд Зилтоид Всезнаещият, Жертви на Cool, Epicloud Iron Maiden Powerslave, Някъде във времето, Piece of Mind, Killers, No Prayer for the Dying Джим Рийвс пее Down the Lane Michael Learns to Rock Blue Night, Eternity, Scandinavia Сценарият No Sound Without Silenc e Том Джоунс отдавна изгубен куфар, похвала и вина, Along Came Jones
Пример – Подреждане на резултатите
Можете да използвате клауза за поръчка, за да подредите резултатите в обединената група. Това се прави с WITHIN GROUP
клауза. Когато използвате тази клауза, посочвате реда с ORDER BY
последвано от ASC
(за нарастване) или DESC
(за спускане).
Пример:
ИЗПОЛЗВАЙТЕ Музика;ИЗБЕРЕТЕ ar.ArtistName, STRING_AGG(al.AlbumName, ',') В рамките на ГРУПА (ПОРЕД ОТ al.AlbumName DESC) ОТ ИЗПЪЛНИТЕЛИ arINNER ПРИСЪЕДИНЕТЕ се Албуми alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;
Резултат:
Име на изпълнител ------------------------- --------------------------- -------------------------------------------------- -------AC/DC Powerage Алън Холдсуърт Шестнадесетте мъже от Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Epicloud, Жертви на Cool Iron Maiden Някъде във времето, Powerslave, Piece of Mind, Без молитва за умиращите, убийците Джим Рийвс пее надолу по алеята Майкъл се научава да рок скандинавия, вечност, синя нощ Сценарият Няма звук без тишина e Том Джоунс Хвалете и обвинявайте, Отдавна изгубен куфар, Дойде Джоунс