XML 值的 SQL Server Where 子句路径
Posted
技术标签:
【中文标题】XML 值的 SQL Server Where 子句路径【英文标题】:SQL Server Where Clause Path for XML Value 【发布时间】:2019-11-26 20:54:06 【问题描述】:主要问题是如何在 SQL for XML 中使用where
子句。
我需要返回出现“团队”的 XML 行。
你可以在这里查看我的小提琴示例:http://sqlfiddle.com/#!18/de221e/2
表:
CREATE TABLE test
(
id int,
value xml
)
INSERT INTO test (id, value)
VALUES
('1', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?> <Atts>
<Att>
<Name>test</Name>
</Att>
<Att>
<Name>team</Name>
</Att>
<Att>
<Name>test</Name>
</Att>
</Atts>'),
('2', N'<?xml version="1.0" encoding="utf-16" standalone="yes"?> <Atts>
<Att>
<Name>test</Name>
</Att>
<Att>
<Name>test</Name>
</Att>
<Att>
<Name>test</Name>
</Att>
</Atts>');
查询:
select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'team'
这不会返回任何东西。
但是,如果您对出现在 XML 中的名字执行 where 子句,它会起作用,例如
select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'test'
返回:
| id | value |
|----|---------------------------------------------------------------------------------------------------|
| 1 | <Atts><Att><Name>test</Name></Att><Att><Name>team</Name></Att><Att><Name>test</Name></Att></Atts> |
| 2 | <Atts><Att><Name>test</Name></Att><Att><Name>test</Name></Att><Att><Name>test</Name></Att></Atts> |
预期结果是这个查询应该返回:
select * from test
where value.value('(/Atts/Att/Name)[1]','varchar(max)') = 'team'
| id | value |
|----|---------------------------------------------------------------------------------------------------|
| 1 | <Atts><Att><Name>test</Name></Att><Att><Name>team</Name></Att><Att><Name>test</Name></Att></Atts> |
如果“团队”出现在 XML 中但不在第一个中,我如何返回它的任何想法
【问题讨论】:
【参考方案1】:最好使用exist()
方法。无论其位置如何,它都会检查“团队”值。 exist() Method (xml Data Type)
SQL
select * from test
where value.exist('/Atts/Att/Name[./text()="team"]') = 1;
【讨论】:
【参考方案2】:这是第二个。您正在查看第一个。
这会给你想要的结果
select * from test
where value.value('(/Atts/Att/Name)[2]','varchar(max)') = 'team'
【讨论】:
以上是关于XML 值的 SQL Server Where 子句路径的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server XML 列上的 Where 子句过滤属性 AND 值
选择 Count Where Values 大于 0 SQL Server
SQL Server - 返回 xml 列的 xml 子节点