SQL Server 2017で導入されたT-SQL関数の1つは、STRING_AGG()
です。 働き。これは基本的にMySQLのGROUP_CONCAT()
と同等です 関数–クエリ結果を行ではなく区切りリストとして返すことができます。
ただし、2つの機能にはいくつかの小さな違いがあります。
この記事では、これらの関数間の主な構文の違いのいくつかについて説明します。
構文
まず、各関数の公式構文は次のとおりです。
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 ] )
構文の違い
MySQLのGROUP_CONCAT()
の3つの主な構文の違いは次のとおりです。 およびT-SQLのSTRING_AGG()
機能:
- デフォルトのセパレーター :おそらく最も明らかな違いは、
STRING_AGG()
セパレータを指定する必要があります。 2つの引数(2つ目は区切り文字)を指定しないと、エラーが発生します。 MySQLのGROUP_CONCAT()
を使用 一方、関数はオプションの引数です。指定しない場合、デフォルトでカンマが使用されます。 - 結果の注文 :MySQLとT-SQLの両方の関数を使用すると、
ORDER BY
を追加できます。 句、構文は少し異なります。 T-SQLでは、WITHIN GROUP
を使用する必要があります 結果セットを注文するときの句ですが、MySQLにはこの要件はありません。 - 明確な結果 :MySQLでは
DISTINCT
を使用できます 一意の値のみを返します。 T-SQLはこのオプションを提供していません。
以下は、これらの違いを示す例です。
デフォルトのセパレーター
MySQL – GROUP_CONCAT()
MySQLでセパレータを指定する必要はありません。これはオプションの引数です。デフォルト値はコンマです。
SELECT GROUP_CONCAT(Genre) AS Result FROM Genres;
結果:
+----------------------------------------------+ | Result | +----------------------------------------------+ | Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk | +----------------------------------------------+
T-SQL – STRING_AGG()
T-SQLでは、区切り文字を指定する必要があります。
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres;
結果:
Result -------------------------------------------- Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
セパレータを指定しないと、エラーが発生します:
SELECT STRING_AGG(Genre) AS Result FROM Genres;
結果:
Error: The STRING_AGG function requires 2 argument(s).
結果の注文
MySQL – GROUP_CONCAT()
MySQLで結果セットを注文するときは、ORDER BY
を追加するだけです。 引数としての句、順序付けする列、ASC
のいずれかが続きます またはDESC
昇順か降順かによって異なります。
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;
結果:
+------------------------+----------------------------------------------------------------------------+ | 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()
連結された結果をORDER BY
で注文する場合 、SQL Serverでは、WITHIN GROUP
が必要です 句を使用します。
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;
結果:
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
明確な結果
MySQL – GROUP_CONCAT()
MySQLのGROUP_CONCAT()
DISTINCT
をサポートします 結果セットから重複する値を削除できる句。
USE Solutions; SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
結果:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
T-SQL – STRING_AGG()
T-SQLのSTRING_AGG()
関数はDISTINCT
をサポートしていません 条項。
USE Solutions; SELECT STRING_AGG(DISTINCT TaskName, ',') FROM Tasks;
結果:
Error: Incorrect syntax near ','.
予想どおり、DISTINCT
を使用しようとするとエラーが発生します STRING_AGG()
を含む句 。