2

SQL XQueryを使用して、すべての要素の特定の属性を連結するにはどうすればよいですか?

私はこのようなテーブルを持っています:

InvoiceId   Details
---------   -----------------------------------------------------------------
1001        <Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/>
1002        <Stuff Id="201" /><Stuff Id="202" q="2"/>

そしてこの結果が必要=>

InvoiceId  IdDetails
---------   ---------------------
1001        101,102,103
1002        201,202
4

3 に答える 3

2

最も簡単な方法は、REPLACEを使用することです。

SELECT
   InvoiceId,
   SUBSTRING(
        REPLACE(
          REPLACE(
            CAST(Details AS nvarchar(max))
                 , '<Stuff Id="', ',')
               , '"/>', '')
             ,2, 2000000000)
FROM
   MyTable
于 2011-05-29T10:00:04.587 に答える
2
declare @T table(InvoiceId int, Details xml)
insert into @T
select 1001, '<Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/>' union all
select 1002, '<Stuff Id="201"/><Stuff Id="202" q="2"/>'

select InvoiceId,
       stuff((select ','+t.n.value('@Id', 'varchar(10)')
              from Details.nodes('Stuff') as t(n) 
              for xml path('')), 1, 1, '') as IdDetails  
from @T

の一意の値のみId

select InvoiceId,
       stuff((select ','+s.id
              from Details.nodes('Stuff') as t(n)
                cross apply (select t.n.value('@Id', 'varchar(10)')) as s(id) 
              group by s.id
              for xml path('')), 1, 1, '') as IdDetails  
from @T
于 2011-05-29T12:30:17.927 に答える
0

おそらく、より良い方法は、副選択などの代わりに、xml処理でクエリ関数を使用することです。Mikael Erikssonの回答に基づいて、この質問から次のことがより速く、より簡潔で読みやすいことがわかりました。

declare @T table(InvoiceId int, Details xml)
insert into @T
select 1001, '<Stuff Id="101" p="3" q="5"/><Stuff Id="102" q="4"/><Stuff Id="103"/>' union all
select 1002, '<Stuff Id="201"/><Stuff Id="202" q="2"/>'

select InvoiceId, 
    t.n.query('for $i in Stuff return concat($i/@Id, ",")').value('.', 'nvarchar(max)')
from @T
    cross apply Details.nodes('.') as t(n)

ただし、結果の文字列には、区切りスペースと終了コンマが含まれます。

于 2015-01-09T16:48:33.300 に答える