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

T-SQLには、文字列を連結するための集計関数がありますか?

    SQL Server 2017以降で使用する場合:

    STRING_AGG()

    set nocount on;
    declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
    insert into @YourTable VALUES (1,1,'CCC')
    insert into @YourTable VALUES (2,2,'B<&>B')
    insert into @YourTable VALUES (3,2,'AAA')
    insert into @YourTable VALUES (4,3,'<br>')
    insert into @YourTable VALUES (5,3,'A & Z')
    set nocount off
    SELECT
        t1.HeaderValue
            ,STUFF(
                       (SELECT
                            ', ' + t2.ChildValue
                            FROM @YourTable t2
                            WHERE t1.HeaderValue=t2.HeaderValue
                            ORDER BY t2.ChildValue
                            FOR XML PATH(''), TYPE
                       ).value('.','varchar(max)')
                       ,1,2, ''
                  ) AS ChildValues
        FROM @YourTable t1
        GROUP BY t1.HeaderValue
    
    SELECT
        HeaderValue, STRING_AGG(ChildValue,', ')
        FROM @YourTable
        GROUP BY HeaderValue
    

    出力:

    HeaderValue 
    ----------- -------------
    1           CCC
    2           B<&>B, AAA
    3           <br>, A & Z
    
    (3 rows affected)
    

    SQL Server 2005および2016までの場合、次のような操作を行う必要があります。

    --Concatenation with FOR XML and eleminating control/encoded character expansion "& < >"
    set nocount on;
    declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
    insert into @YourTable VALUES (1,1,'CCC')
    insert into @YourTable VALUES (2,2,'B<&>B')
    insert into @YourTable VALUES (3,2,'AAA')
    insert into @YourTable VALUES (4,3,'<br>')
    insert into @YourTable VALUES (5,3,'A & Z')
    set nocount off
    SELECT
        t1.HeaderValue
            ,STUFF(
                       (SELECT
                            ', ' + t2.ChildValue
                            FROM @YourTable t2
                            WHERE t1.HeaderValue=t2.HeaderValue
                            ORDER BY t2.ChildValue
                            FOR XML PATH(''), TYPE
                       ).value('.','varchar(max)')
                       ,1,2, ''
                  ) AS ChildValues
        FROM @YourTable t1
        GROUP BY t1.HeaderValue
    

    出力:

    HeaderValue ChildValues
    ----------- -------------------
    1           CCC
    2           AAA, B<&>B
    3           <br>, A & Z
    
    (3 row(s) affected)
    

    また、すべてのFOR XML PATHではないことに注意してください。 連結は、上記の例のようにXML特殊文字を適切に処理します。



    1. MySQL:同じMySqlインスタンスでMySQLデータベースのクローンを作成する

    2. MySQLでテーブル名として数字を使用することは許可されていますか?

    3. MicrosoftAccessテンプレートを使用する利点

    4. SQL Serverで末尾の空白を削除する方法– RTRIM()