SQL Server 2017以降、クエリ結果をリストとして表示できるようになりました。これは、結果セットをコンマ区切りのリスト、スペース区切りのリスト、または使用するために選択した任意の区切り文字として表示できることを意味します。
SQL Server 2017より前にこれと同じ効果を達成できたのは事実ですが、少し面倒でした。
Transact-SQLにSTRING_AGG()
が追加されました 関数。文字列式の値を連結し、それらの間にセパレータ値を配置します。これは、MySQLのGROUP_CONCAT()
とほぼ同じように機能します 機能。
この記事では、T-SQLのSTRING_AGG()
を示す例を示します。 機能。
サンプルデータ
まず、サンプルデータをいくつか示します。
SELECT TaskId, TaskName FROM Tasks;
結果:
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
例–カンマ区切りリスト
したがって、上記のデータを取得して、STRING_AGG()
を使用できます。 すべてのタスク名を1つの大きなコンマ区切りリストにリストする関数。
このように:
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
結果:
Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats
もちろん、必ずしもコンマで区切る必要はありません。 NVARCHAR
の任意の式で区切ることができます またはVARCHAR
タイプし、リテラルまたは変数にすることができます。
例–列の組み合わせ
CONCAT()
を使用することもできます 独自の区切り文字で区切られた2つのフィールドを結合する関数。
例:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ') FROM Tasks;
結果:
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats
例–ヌル値
結果セットにnull値が含まれている場合、それらの値は無視され、対応する区切り文字は追加されません。
これが適切でない場合は、ISNULL()
を使用して、null値の値を指定できます。 関数を使用して、null値が検出されたときに使用する値を渡します。これを行うと、行にnull値が含まれている場合でも結果を確実に得ることができます。
たとえば、次のクエリと結果セットについて考えてみます。
SELECT TaskCode FROM Tasks;
結果:
TaskCode -------- cat123 null null pnt456 rof789 null
結果セット内に3つのヌル値があることがわかります。
これをSTRING_AGG()
で実行すると 関数、これを取得します:
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
結果:
cat123, pnt456, rof789
ただし、ISNULL()
を使用する場合 null値のプレースホルダーを提供する関数を使用すると、次のようになります。
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') FROM Tasks;
結果:
cat123, N/A, N/A, pnt456, rof789, N/A
例–グループ化された結果
STRING_AGG()
を使用することもできます 結果セットをグループ化するときに機能します。たとえば、アーティストごとにグループ化されたアルバムのリストが必要な場合があります。
これを実証するために、2つのテーブルを持つデータベースを想像してください。 Artists
およびAlbums
。これらのテーブルの間には1対多の関係があります。すべてのアーティストにとって、多くのアルバムが存在する可能性があります。
したがって、両方のテーブルを結合する通常のクエリは次のようになります。
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
結果:
ArtistName AlbumName ------------------------- ------------------------ Iron Maiden Powerslave AC/DC Powerage Jim Reeves Singing Down the Lane Devin Townsend Ziltoid the Omniscient Devin Townsend Casualties of Cool Devin Townsend Epicloud Iron Maiden Somewhere in Time Iron Maiden Piece of Mind Iron Maiden Killers Iron Maiden No Prayer for the Dying The Script No Sound Without Silence Buddy Rich Big Swing Face Michael Learns to Rock Blue Night Michael Learns to Rock Eternity Michael Learns to Rock Scandinavia Tom Jones Long Lost Suitcase Tom Jones Praise and Blame Tom Jones Along Came Jones Allan Holdsworth All Night Wrong Allan Holdsworth The Sixteen Men of Tain
ご覧のとおり、アーティストが複数のアルバムを持っている場合、アーティストの名前は複数回(アルバムごとに1回)リストされます。
ただし、STRING_AGG()
を使用できます これを変更して、各アーティストを1回だけリストし、その後にリリースしたアルバムのコンマ区切りのリストを追加します。
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
結果:
ArtistName ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage Allan Holdsworth All Night Wrong, The Sixteen Men of Tain Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Casualties of Cool, Epicloud Iron Maiden Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying Jim Reeves Singing Down the Lane Michael Learns to Rock Blue Night, Eternity, Scandinavia The Script No Sound Without Silence Tom Jones Long Lost Suitcase, Praise and Blame, Along Came Jones
例–結果の注文
order句を使用して、連結されたグループ内の結果を並べ替えることができます。これは、WITHIN GROUP
を使用して行われます。 句。この句を使用する場合は、ORDER BY
で順序を指定します その後にASC
のいずれかが続きます (昇順の場合)またはDESC
(降順)
例:
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;>
結果:
ArtistName ------------------------- ------------------------------------------------------------------------------ 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