sql >> データベース >  >> RDS >> Sqlserver

SQL Serverでクエリ結果をコンマ区切りリストとして返す方法– STRING_AGG()

    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                        
    

    1. EXECUTEFORMATの使用方法...postgres関数での使用

    2. 別のテーブルのデータを使用して計算列を作成する

    3. SQLステートメントを引数可能にする理由は何ですか?

    4. SQL Serverでの日付と時刻のデータ型間の変換(T-SQLの例)