在 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
考虑这个简单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