在 SQL 服务器中的 XML 数组中提取符合条件的数据

Extract data matching a condition inside an XML array in SQL server

考虑这个简单tableid (int), name (varchar), customFields (xml)

customFields 包含 C# 字典的 XML 表示。例如:

 <dictionary>
   <item>
     <key><int>1</int></key>
     <value><string>Audi</string></value>
   </item>
   <item>
     <key><int>2</int></key>
     <value><string>Red</string></value>
   </item>
 </dictionary>

如何 select 我的 table 的所有行有 3 列:id、名称和 1 列是 string 标签的内容,其中 int 标签等于 1.

最接近我设法得到的结果是:

SELECT id, name, C.value('(value/string/text())[1]', 'varchar(max)')
FROM myTable
OUTER APPLY customFields.nodes('/dictionary/item') N(C)
WHERE (customFields IS NULL OR C.value('(key/int/text())[1]', 'int') = 1)

问题是,如果 xml 没有 int 标记 = 1,则根本不会返回该行(我仍然希望获得包含 id、名称和 NULL 在第 3 列)

我创建了一个与您的相同的 table,此查询运行良好:

select id, name,
     (select C.value('(value/string/text())[1]','varchar(MAX)')
      from xmlTable inr outer apply
      customField.nodes('/dictionary/item') N(C)
      where 
      C.value('(key/int/text())[1]','int') = 1
      and inr.id = ou.id) as xmlVal
from xmlTable ou

这是我的结果:

您的查询不起作用的原因是因为它首先为 "myTable" 中的所有行选择 "value/string" 的值,然后过滤它们。因此,空值仅出现在空字段上,而在其他字段(包含任何 xml 值)上,显示 "value/string/text()"。这是没有 where 子句的查询 returns:

id,name,xml
1   lol NULL
2   rotfl   Audi
2   rotfl   Red
3   troll   Red