SQL Server中XQuery的Exist()子句多条件使用方法咨询
SQL Server XQuery exist() 多条件查询方法
你原有查询的错误点在于:节点文本内容不能直接用value引用,@Name是属性的标准引用语法,节点文本需要通过text()函数获取,同时exist()返回BIT类型值,需要显式判断等于1才会按「节点存在」过滤结果。
修正后的基础查询(单节点同时匹配属性+节点值)
SELECT * FROM A WHERE XmlList.exist(N'/Property/Value[@Name="Patt1" and text()="Pval1"]') = 1
你也可以用.代表当前节点本身来匹配值,写法如下:
SELECT * FROM A WHERE XmlList.exist(N'/Property/Value[@Name="Patt1" and .="Pval1"]') = 1
更多多条件场景用法
单个节点多属性+值同时匹配
如果需要匹配单个节点的多个属性+节点值,直接在方括号内用and拼接所有条件即可,示例:-- 匹配Name为Patt1、Type属性为String、值为Pval1的Value节点 SELECT * FROM A WHERE XmlList.exist(N'/Property/Value[@Name="Patt1" and @Type="String" and text()="Pval1"]') = 1多个不同节点同时存在匹配
如果需要同时满足多个不同的Value节点都存在,有两种常用写法:-- 写法1:多个exist条件拼接,可读性更高 SELECT * FROM A WHERE XmlList.exist(N'/Property/Value[@Name="Patt1" and text()="Pval1"]') = 1 AND XmlList.exist(N'/Property/Value[@Name="patt2" and text()="Pval2"]') = 1 -- 写法2:单个exist中写多节点匹配逻辑 SELECT * FROM A WHERE XmlList.exist(N'/Property[Value[@Name="Patt1" and text()="Pval1"] and Value[@Name="patt2" and text()="Pval2"]]') = 1
注意:XQuery对大小写敏感,属性名、属性值、节点值的大小写都需要和实际XML存储的内容完全一致才能匹配成功。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

