考虑这个简单的表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栏)
答案 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
这是我的结果:
你的查询没有奏效的原因是它首先选择&#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