簡體   English   中英

從逗號分隔的 GUID 中提取逗號分隔的值

[英]Extract comma separated values from comma separated GUIDs

我在表T1中有一個名為Categories的列,其中包含 XML 中的 GUID。 我可以使用以下查詢以逗號分隔的形式提取 GUID。

SELECT
  Row, ID, Name, City,
  Category = STUFF(
    (
      SELECT ',' + t.c.value('.', 'nvarchar(max)') 
      FROM dbo.T1 t1  
      OUTER APPLY t1.Categories.nodes('root/string') as t(c)
      WHERE t1.ID = t2.ID FOR XML PATH('')
    ), 1, 1, ''
  )
FROM
  dbo.T1 t2

我有另一個表T2 ,其中包含類別的名稱。 我現在想將這些逗號分隔的 GUID 用於 go 並從T2獲取它們對應的Name

我需要在我的 SELECT 語句中進行哪些更改以編寫一個 LEFT OUTER JOIN ,它采用這個逗號分隔的 GUID 並從T2返回逗號分隔的名稱。

T2看起來像這樣:

T2 看起來像這樣

我會在連接值之前加入類別名稱表,以避免再次進行拆分和連接迭代。

樣本數據

create table xmlData
(
  id int,
  data xml
);

insert into xmlData (id, data) values
(1,'
<root>
  <guid>5d8547aa-e1e7-4f69-88a2-655879531582</guid>
  <guid>78555c5d-e39f-48f3-a148-30161b0fb995</guid>
</root>
'),
(2,'
<root>
  <guid>5d8547aa-e1e7-4f69-88a2-655879531582</guid>
  <guid>f58177f6-63c8-4985-baa8-2db05248f13f</guid>
</root>
'),
(3,'
<root>
  <guid>5d8547aa-e1e7-4f69-88a2-655879531582</guid>
  <guid>d8f9b789-6d60-4688-9d91-c0f8b1df5319</guid>
</root>
');

create table categoryName
(
  guid uniqueidentifier,
  name nvarchar(20)
);

insert into categoryName (guid, name) values
('5d8547aa-e1e7-4f69-88a2-655879531582', 'Alpha'),
('78555c5d-e39f-48f3-a148-30161b0fb995', 'Beta'),
('f58177f6-63c8-4985-baa8-2db05248f13f', 'Gamma'),
('d8f9b789-6d60-4688-9d91-c0f8b1df5319', 'Delta');

解決方案

兩個版本,因為 SQL 服務器版本未在問題標簽中指定... string_agg() function 從 Z9778840A0100CB30C9828767417B0B5A2Z 服務器開始可用。20

使用string_agg()

select xd.id,
       string_agg(cn.name, ',') as 'category_names'
from xmlData xd
cross apply xd.data.nodes('root/guid') g(guid)
join categoryName cn
  on cn.guid = g.guid.value('.', 'nvarchar(36)')
group by xd.id
order by xd.id;

沒有string_agg()

select xd.id,
       stuff( ( select ',' + cn.name
                from xmlData xd2
                cross apply xd.data.nodes('root/guid') g(guid)
                join categoryName cn
                  on cn.guid = g.guid.value('.', 'nvarchar(36)')
                where xd2.id = xd.id
                for xml path('') ), 1, 1, '' ) as 'category_names'
from xmlData xd
order by xd.id;

結果

id  category_names
--  --------------
1   Alpha,Beta
2   Alpha,Gamma
3   Alpha,Delta

小提琴以查看實際情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM