提取与SQL Server中XML数组内的条件匹配的数据

时间:2015-01-26 15:40:11

标签: sql sql-server xml sql-server-2012 cross-apply

考虑这个简单的表id (int), name (varchar), customFields (xml)

customFields包含C#Dictionary的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>

如何选择包含3列的表格的所有行:id,name和1列,string标记的内容,其中int标记的值等于1。 / p>

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

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,name和NULL的行第3栏)

1 个答案:

答案 0 :(得分:2)

我已经创建了一个与您相同的表格,这个查询运行正常:

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

这是我的结果: xml-query

你的查询没有奏效的原因是它首先选择&#34; value / string&#34;的值。来自&#34; myTable&#34;的所有行然后过滤它们。因此,空值仅出现在空字段上,而在其他字段(包含任何xml值)上,&#34; value / string / text()&#34;被展示。这是没有where子句返回的查询:

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