sql >> Databáze >  >> RDS >> Sqlserver

Jak používat XQuery k simulaci STRING_AGG() (seskupené zřetězení řetězců)?

Hledáte toto?

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);

Výsledek

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

AKTUALIZACE Více adres a identických údajů

Můžete to zkusit (podle vašeho komentáře)

Vaše testovací data s jednou druhou adresou a jednou zkopírovanou adresou:

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>'

--Dotaz

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);

Myšlenka ve zkratce:

První XQuery používáme k vytvoření jednoduchého fragmentu XML, jako je tento

<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>

Díky tomu můžeme použít druhý XQuery a umístit distinct-values() tam.




  1. Je mezi těmito dvěma dotazy rozdíl?

  2. Jednoduchá proměnná Oracle SQL Assignment

  3. StarJoinInfo v prováděcích plánech

  4. Úspěšné SQL Injection navzdory PHP Magic Quotes