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

XQuery を使用して STRING_AGG() (グループ化された文字列連結) をシミュレートする方法は?

    これをお探しですか?

    select 
     isnull(STUFF(a.x.query('for $s in  entity/info/cleaned_name return <x>{concat(",",$s)}</x>').value('.','varchar(max)'),1,1,''),'') as 'Nazwa podmiotu' 
    ,isnull(STUFF(a.x.query('for $s in proceeding/signatures return <x>{concat(",",$s)}</x>').value('.','varchar(max)'),1,1,''),'') as 'Sygnatura'
    ,isnull(STUFF(a.x.query('for $s in entity
                             return <x>
                                    {
                                    concat(", ",($s/address/zip_code/text())[1]," "
                                               ,($s/address/town/text())[1]," "
                                               ,($s/address/street/text())[1]," "
                                               ,($s/address/house_number/text())[1],"/"
                                               ,($s/address/flat_number/text())[1]
                                              )
                                    }
                                    </x>').value('.','varchar(max)'),1,2,''),'') 
        from @xml.nodes('/root/Row') as a(x);
    

    結果

    Nazwa podmiotu          Sygnatura                           AllAdresses
    Kate Smith,John Smith   V GU 86/18,V GUp 9/19,V GUp 8/19    00-001 London  Downing Street 1 /1, 00-001 Washington  Pennsylvania Avenue 1/1
    

    UPDATE 複数のアドレスと同一のデータ

    これを試すことができます (コメントによると)

    1 秒のアドレスと 1 つのコピーされたアドレスを含むテスト データ:

    declare @xml as xml = '<root>
        <Row>
            <proceeding>
                <signatures>V GU 86/18</signatures>
                <signatures>V GUp 9/19</signatures>
                <signatures>V GUp 8/19</signatures>
            </proceeding>
            <entity>
                <info>
                    <cleaned_name>Kate Smith</cleaned_name>
                </info>
                <address>
                    <town>London </town>
                    <house_number>1 </house_number>
                    <flat_number>1</flat_number>
                    <street>Downing Street</street>
                    <zip_code>00-001</zip_code>
                </address>
                <address>
                    <town>Yorkshire </town>
                    <house_number>1 </house_number>
                    <flat_number>1</flat_number>
                    <street>Morning Street</street>
                    <zip_code>00-999</zip_code>
                </address>
            </entity>
            <entity>
                <info>
                    <cleaned_name>John Smith</cleaned_name>
                </info>
                <address>
                    <town>Washington </town>
                    <house_number>1</house_number>
                    <flat_number>1</flat_number>
                    <street>Pennsylvania Avenue</street>
                    <zip_code>00-001</zip_code>
                </address>
                <address>
                    <town>Washington </town>
                    <house_number>1</house_number>
                    <flat_number>1</flat_number>
                    <street>Pennsylvania Avenue</street>
                    <zip_code>00-001</zip_code>
                </address>
            </entity>
        </Row>
    </root>'
    

    -- クエリ

    select 
     isnull(STUFF(a.x.query('for $s in  entity/info/cleaned_name return <x>{concat(",",$s)}</x>').value('.','varchar(max)'),1,1,''),'') as 'Nazwa podmiotu' 
    ,isnull(STUFF(a.x.query('for $s in proceeding/signatures return <x>{concat(",",$s)}</x>').value('.','varchar(max)'),1,1,''),'') as 'Sygnatura'
    ,isnull(STUFF(a.x.query('for $s in entity/address
                                return
                                <x>{concat(", ",($s/zip_code/text())[1]," "
                                               ,($s/town/text())[1]," "
                                               ,($s/street/text())[1]," "
                                               ,($s/house_number/text())[1],"/"
                                               ,($s/flat_number/text())[1]
                                           )}</x>')
                       .query('for $a in distinct-values(/x/text()) return $a').value('.','varchar(max)'),1,2,''),'') 
        from @xml.nodes('/root/Row') as a(x);
    

    要するにアイデア:

    最初の XQuery を使用して、このような単純な XML フラグメントを作成します

    <x>, 00-001 London  Downing Street 1 /1</x>
    <x>, 00-999 Yorkshire  Morning Street 1 /1</x>
    <x>, 00-001 Washington  Pennsylvania Avenue 1/1</x>
    <x>, 00-001 Washington  Pennsylvania Avenue 1/1</x>
    

    これにより、2 番目の XQuery を使用して distinct-values() を配置できます




    1. データをロードするファイルのデフォルト値がテーブルに挿入されない

    2. 1つの結果行で複数の行を選択します

    3. 1つのSQLステートメントでサブストリングと置換を使用するにはどうすればよいですか?

    4. Postgresqlで動的な12営業日ビューを取得するにはどうすればよいですか?