Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Group_Concat() a T-SQL String_Agg()

Jedną z funkcji T-SQL wprowadzonych w SQL Server 2017 jest STRING_AGG() funkcjonować. Jest to w zasadzie odpowiednik funkcji GROUP_CONCAT() w MySQL funkcja – pozwala zwracać wyniki zapytania w formie rozdzielanej listy, a nie w wierszach.

Istnieje jednak kilka drobnych różnic między tymi dwiema funkcjami.

W tym artykule omówiono niektóre z głównych różnic składniowych między tymi funkcjami.

Składnia

Po pierwsze, oto oficjalna składnia każdej funkcji.

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 ] )

Różnice składni

Oto trzy główne różnice w składni między GROUP_CONCAT() MySQL i STRING_AGG() w T-SQL funkcje:

  • Domyślny separator :Prawdopodobnie najbardziej oczywistą różnicą jest fakt, że STRING_AGG() wymaga podania separatora. Jeśli nie podasz dwóch argumentów (drugi z nich jest separatorem), otrzymasz błąd. Dzięki GROUP_CONCAT() w MySQL z drugiej strony separator jest argumentem opcjonalnym. Jeśli go nie podasz, domyślnie użyje przecinka.
  • Porządkowanie wyników :Podczas gdy funkcje MySQL i T-SQL umożliwiają dodanie ORDER BY klauzula, składnia jest nieco inna. T-SQL wymaga użycia WITHIN GROUP klauzula podczas porządkowania zestawu wyników, podczas gdy MySQL nie ma tego wymagania.
  • Wyróżniające się wyniki :MySQL pozwala na użycie DISTINCT zwracać tylko unikalne wartości. T-SQL nie zapewnia tej opcji.

Poniżej znajdują się przykłady demonstrujące te różnice.

Domyślny separator

MySQL – GROUP_CONCAT()

Nie musimy określać separatora w MySQL. To jest argument opcjonalny. Domyślną wartością jest przecinek.

SELECT GROUP_CONCAT(Genre) AS Result
FROM Genres;

Wynik:

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

T-SQL – STRING_AGG()

T-SQL wymaga od nas określenia separatora.

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

Wynik:

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

Jeśli nie określimy separatora, otrzymamy błąd:

SELECT STRING_AGG(Genre) AS Result
FROM Genres;

Wynik:

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

Porządkowanie wyników

MySQL – GROUP_CONCAT()

Zamawiając zestaw wyników w MySQL, po prostu dodaj ORDER BY klauzulę jako argument, po której następuje kolumna, według której ma być ona uporządkowana, po której następuje albo ASC lub DESC w zależności od tego, czy chcesz go w porządku rosnącym czy malejącym.

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;

Wynik:

+------------------------+----------------------------------------------------------------------------+
| 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()

Przy zamawianiu połączonych wyników za pomocą ORDER BY ,  SQL Server wymaga, aby element WITHIN GROUP należy użyć klauzuli.

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;

Wynik:

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                        

Wyraźne wyniki

MySQL – GROUP_CONCAT()

GROUP_CONCAT() w MySQL obsługuje DISTINCT klauzula, która pozwala wyeliminować zduplikowane wartości z zestawu wyników.

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

Wynik:

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

T-SQL – STRING_AGG()

STRING_AGG() w T-SQL funkcja nie obsługuje DISTINCT klauzula.

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

Wynik:

Error: Incorrect syntax near ','.

Zgodnie z oczekiwaniami, jeśli spróbujemy użyć DISTINCT, wystąpi błąd klauzula z 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. Uwaga:konwersja tablicy na ciąg znaków w

  2. instalacja gem:nie udało się zbudować natywnego rozszerzenia gem (nie można znaleźć plików nagłówkowych)

  3. Zamień pierwszą literę każdego słowa na wielką literę w istniejącej tabeli

  4. Importuj dane do bazy danych MySQL

  5. Jak dodać opcję do sql_mode w MySQL bez utraty istniejących ustawień?