Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Group_Concat() срещу T-SQL String_Agg()

Една от функциите на 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() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталиране на уеб сървър във FreeBSD 6.0 с Apache 2.2, MySQL 5.0 и PHP 5 – част 3

  2. Най-важните грешки, които трябва да избягвате при репликацията на MySQL

  3. Актуализирайте стойност на колона, като замените част от низ

  4. Най-добра производителност на MySQL DigitalOcean – ScaleGrid срещу DigitalOcean управлявани бази данни

  5. PDO извлича една колона от таблица в едномерен масив