sql >> Database >  >> RDS >> Mysql

MySQL Group_Concat() versus T-SQL String_Agg()

Een van de T-SQL-functies die in SQL Server 2017 zijn geïntroduceerd, is de STRING_AGG() functie. Dit is in feite het equivalent van MySQL's GROUP_CONCAT() functie – hiermee kunt u zoekopdrachtresultaten retourneren als een lijst met scheidingstekens, in plaats van in rijen.

Maar er zijn een paar kleine verschillen tussen de twee functies.

Dit artikel onderzoekt enkele van de belangrijkste syntaxisverschillen tussen deze functies.

Syntaxis

Allereerst, hier is de officiële syntaxis voor elke functie.

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 ( expression, separator ) [ <order_clause> ]

<order_clause> ::=   
    WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

Syntaxisverschillen

Dit zijn de drie belangrijkste syntaxisverschillen tussen GROUP_CONCAT() van MySQL en T-SQL's STRING_AGG() functies:

  • Standaard scheidingsteken :Het meest voor de hand liggende verschil is waarschijnlijk het feit dat STRING_AGG() vereist dat u een scheidingsteken opgeeft. Als u geen twee argumenten opgeeft (waarvan de tweede het scheidingsteken is), krijgt u een foutmelding. Met MySQL's GROUP_CONCAT() functie aan de andere kant is het scheidingsteken een optioneel argument. Als je het niet opgeeft, zal het standaard een komma gebruiken.
  • De resultaten bestellen :Hoewel je met de functies van zowel MySQL als T-SQL een ORDER BY kunt toevoegen clausule, is de syntaxis iets anders. T-SQL vereist dat u de WITHIN GROUP . gebruikt clausule bij het bestellen van de resultatenset, terwijl MySQL deze vereiste niet heeft.
  • Afzonderlijke resultaten :MySQL stelt u in staat om DISTINCT . te gebruiken om alleen unieke waarden te retourneren. T-SQL biedt deze optie niet.

Hieronder staan ​​voorbeelden om deze verschillen te demonstreren.

Standaard scheidingsteken

MySQL – GROUP_CONCAT()

We hoeven het scheidingsteken niet op te geven in MySQL. Dit is een optioneel argument. De standaardwaarde is een komma.

SELECT GROUP_CONCAT(Genre) AS Result
FROM Genres;

Resultaat:

+----------------------------------------------+
| Result                                       |
+----------------------------------------------+
| Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk |
+----------------------------------------------+

T-SQL – STRING_AGG()

T-SQL vereist dat we het scheidingsteken specificeren.

SELECT STRING_AGG(Genre, ',') AS Result
FROM Genres;

Resultaat:

Result                                      
--------------------------------------------
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk

Als we geen scheidingsteken opgeven, krijgen we een foutmelding:

SELECT STRING_AGG(Genre) AS Result
FROM Genres;

Resultaat:

Error: The STRING_AGG function requires 2 argument(s).

De resultaten bestellen

MySQL – GROUP_CONCAT()

Wanneer u de resultatenset in MySQL bestelt, voegt u eenvoudig de ORDER BY . toe clausule als een argument, gevolgd door de kolom om het te ordenen, gevolgd door ofwel ASC of DESC afhankelijk van of je het in oplopende of aflopende volgorde wilt.

USE Music;
SELECT 
  ar.ArtistName AS 'Artist',
  GROUP_CONCAT(al.AlbumName ORDER BY al.AlbumName DESC) AS 'Album List'
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Resultaat:

+------------------------+----------------------------------------------------------------------------+
| Artist                 | Album List                                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | The Sixteen Men of Tain,All Night Wrong                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Ziltoid the Omniscient,Epicloud,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Powerslave,Piece of Mind,No Prayer for the Dying,Killers |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Scandinavia,Eternity,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Praise and Blame,Long Lost Suitcase,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

T-SQL – STRING_AGG()

Bij het bestellen van de aaneengeschakelde resultaten met ORDER BY ,  SQL Server vereist dat de WITHIN GROUP clausule worden gebruikt.

USE Music;
SELECT 
  ar.ArtistName AS 'Artist',
  STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) AS 'Album List'
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Resultaat:

Artist                     Album List                                                                    
-------------------------  ------------------------------------------------------------------------------
AC/DC                      Powerage                                                                      
Allan Holdsworth           The Sixteen Men of Tain, All Night Wrong                                      
Buddy Rich                 Big Swing Face                                                                
Devin Townsend             Ziltoid the Omniscient, Epicloud, Casualties of Cool                          
Iron Maiden                Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, Killers
Jim Reeves                 Singing Down the Lane                                                         
Michael Learns to Rock     Scandinavia, Eternity, Blue Night                                             
The Script                 No Sound Without Silence                                                      
Tom Jones                  Praise and Blame, Long Lost Suitcase, Along Came Jones                        

Afzonderlijke resultaten

MySQL – GROUP_CONCAT()

MySQL's GROUP_CONCAT() ondersteunt de DISTINCT clausule, waarmee u dubbele waarden uit de resultatenset kunt verwijderen.

USE Solutions;
SELECT GROUP_CONCAT(DISTINCT TaskName) 
FROM Tasks;

Resultaat:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName)                        |
+--------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Relax,Take dog for walk |
+--------------------------------------------------------+

T-SQL – STRING_AGG()

STRING_AGG() . van T-SQL functie ondersteunt de DISTINCT . niet clausule.

USE Solutions;
SELECT STRING_AGG(DISTINCT TaskName, ',') 
FROM Tasks;

Resultaat:

Error: Incorrect syntax near ','.

Zoals verwacht, treedt er een fout op als we proberen de DISTINCT . te gebruiken clausule met STRING_AGG() .


  1. MySQL - tel het totale aantal rijen in php

  2. Kolomrechten retourneren van een gekoppelde server in SQL Server (T-SQL-voorbeelden)

  3. Interviewtips voor SQL-databasebeheerders

  4. Hoe erachter te komen of de gebruiker aanwezig is in Sqlite Database met Android?