Една от функциите на T-SQL, въведени в SQL Server 2017, е STRING_AGG()
функция. Това основно е еквивалентът на GROUP_CONCAT()
на MySQL функция – тя ви позволява да връщате резултатите от заявката като разделен списък, а не в редове.
Но има няколко малки разлики между двете функции.
Тази статия изследва някои от основните разлики в синтаксиса между тези функции.
Синтаксис
Първо, ето официалния синтаксис за всяка функция.
MySQL – GROUP_CONCAT()
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
T-SQL – STRING_AGG()
STRING_AGG (израз, разделител) [] ::=В ГРУПАТА ( ORDER BY [ ASC | DESC ] )
Разлики в синтаксиса
Ето трите основни разлики в синтаксиса между GROUP_CONCAT()
на MySQL и STRING_AGG()
на T-SQL функции:
- Разделител по подразбиране :Вероятно най-очевидната разлика е фактът, че
STRING_AGG()
изисква да посочите разделител. Ако не предоставите два аргумента (вторият от които е разделител), ще получите грешка. СGROUP_CONCAT()
на MySQL функция от друга страна, разделителят е незадължителен аргумент. Ако не го предоставите, той ще използва запетая по подразбиране. - Поръчване на резултатите :Докато функциите на MySQL и T-SQL ви позволяват да добавите
ORDER BY
клауза, синтаксисът е малко по-различен. T-SQL изисква от вас да използватеWITHIN GROUP
клауза при поръчване на набора от резултати, докато MySQL няма това изискване. - Отличи резултати :MySQL ви позволява да използвате
DISTINCT
да върне само уникални стойности. T-SQL не предоставя тази опция.
По-долу са дадени примери за демонстриране на тези разлики.
Разделител по подразбиране
MySQL – GROUP_CONCAT()
Не е необходимо да указваме разделителя в MySQL. Това е незадължителен аргумент. Стойността по подразбиране е запетая.
ИЗБЕРЕТЕ GROUP_CONCAT(Жанр) КАТО ResultFROM Genres;
Резултат:
+------------------------------------------------------- +| Резултат |+------------------------------------------------+ | Рок, джаз, кънтри, поп, блус, хип-хоп, рап, пънк |+-------------------------------- --------------+
T-SQL – STRING_AGG()
T-SQL изисква от нас да посочим разделителя.
ИЗБЕРЕТЕ STRING_AGG(Genre, ',') КАТО ResultFROM Genres;
Резултат:
Резултат ----------------------------------------------------Рок, Джаз, кънтри, поп, блус, хип-хоп, рап, пънк
Ако не посочим разделител, получаваме грешка:
ИЗБЕРЕТЕ STRING_AGG(Жанр) КАТО ResultFROM Genres;
Резултат:
Грешка:Функцията STRING_AGG изисква 2 аргумента.
Поръчване на резултатите
MySQL – GROUP_CONCAT()
Когато поръчвате набора от резултати в MySQL, просто добавете ORDER BY
клауза като аргумент, последвана от колоната за подреждане, последвана от ASC
или DESC
в зависимост от това дали го искате във възходящ или низходящ ред.
ИЗПОЛЗВАЙТЕ музика;ИЗБЕРЕТЕ ar.ArtistName КАТО „Изпълнител“, GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) КАТО „Списък с албуми“ ОТ ИЗПЪЛНИТЕЛИ arINNER ПРИСЪЕДИНЕТЕ се Албуми alON ar.ArtistId =al.ArtistNameGROUP BY Artist предварително>Резултат:
+-----------------------+--------------------- -------------------------------------------------- -----+| Художник | Списък с албуми |+-----------------------+--------------------- -------------------------------------------------- -----+| AC/DC | Мощност || Алън Холдсуърт | Шестнадесетте мъже от Тейн, цяла нощ грешна || Бъди Рич | Big Swing Face || Девин Таунсенд | Ziltoid the Omniscient,Epicloud,Cassals of Cool || Iron Maiden | Някъде във времето, Powerslave, Част от ума, Без молитва за умиращите, Убийци || Джим Рийвс | Пеене надолу по алеята || Майкъл се научава да рок | Скандинавия,Вечност,Синя нощ || Сценарият | Няма звук без тишина || Том Джоунс | Похвала и вина, отдавна изгубен куфар, дойде и Джоунс |+------------------------+------------ -------------------------------------------------- --------------+T-SQL – STRING_AGG()
При подреждане на конкатенираните резултати с
ORDER BY
, SQL Server изискваWITHIN GROUP
да се използва клауза.ИЗПОЛЗВАЙТЕ Музика;ИЗБЕРЕТЕ ar.ArtistName КАТО 'Изпълнител', STRING_AGG(al.AlbumName, ',') В ГРУПАТА (ПОРЪЧКА ПО al.AlbumName DESC) КАТО 'Списък с албуми' ОТ ИЗПЪЛНИТЕЛИ arINNER JOIN Албуми alON ar.ArtistId al.ArtistIdGROUP BY ArtistName;Резултат:
Списък с албуми на изпълнители ------------------------- ------------------- -------------------------------------------------- --------- AC/DC Powerage Алън Холдсуърт Шестнадесетте мъже на Тейн, Цяла нощ Грешен приятел, Рич Голямо люлеене Девин Таунсенд Зилтоид Всезнаещият, Epicloud, Жертви на Cool Iron Maiden Някъде във времето, Powerslave, Piece of Ум, без молитва за умиращите, убийцитеДжим Рийвс пее надолу по алеята Майкъл се научава да рок скандинавия, вечност, синя нощ Сценарият Няма звук без тишина e Том Джоунс Хвалете и обвинявайте, Отдавна изгубен куфар, Дойде ДжоунсОтличи резултати
MySQL – GROUP_CONCAT()
GROUP_CONCAT()
на MySQL поддържаDISTINCT
клауза, която ви позволява да премахнете дублиращи се стойности от набора от резултати.ИЗПОЛЗВАЙТЕ решения;ИЗБЕРЕТЕ GROUP_CONCAT(DISTINCT TaskName) ОТ Задачи;Резултат:
+------------------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT TaskName) |+------------------------------------------- ------------+| Правете градина, Хранете котки, Боядисвайте покрива, Отпуснете се, Извеждайте кучето на разходка |+-------------------------------- -----------------------+T-SQL – STRING_AGG()
STRING_AGG()
на T-SQL функцията не поддържаDISTINCT
клауза.ИЗПОЛЗВАЙТЕ решения;ИЗБЕРЕТЕ STRING_AGG(DISTINCT TaskName, ',') ОТ Задачи;Резултат:
Грешка:Неправилен синтаксис близо до „,“.Както се очакваше, възниква грешка, ако се опитаме да използваме
DISTINCT
клауза сSTRING_AGG()
.