3

考虑到这个简单的表id (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>

如何选择包含 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 没有标签 = 1,则根本不会返回该行(我仍然想在第三列中int获得带有 id、name 和 name 的行)NULL

4

1 回答 1

4

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

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

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

id,name,xml
1   lol NULL
2   rotfl   Audi
2   rotfl   Red
3   troll   Red
于 2015-01-26T17:47:38.290 回答