问题#1:可以使用value()
或exist()
方法过滤行。我想知道哪一个更快。
问题2:在SQL中,我们使用IN
运算符,如下所示:
select *
from abc
where abcid in (1,2)
类似地,我们在处理XML时可以使用IN
运算符吗?
查询#1:
WITH XMLNAMESPACES (
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)
SELECT
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)')
FROM
Production.ProductModel
WHERE
CatalogDescription.exist('/PD:ProductDescription[@ProductModelName=''Mountain 100''][1]') = 1
查询#2:
WITH XMLNAMESPACES (
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)
SELECT
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)')
FROM
Production.ProductModel
WHERE
CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'nvarchar(100)') = 'Mountain 100'
您诚挚的
答案 0 :(得分:0)
(1)差异可能来自你的指数。
PATH索引将提高WHERE子句上exists()谓词的性能,而PROPERTY索引将提升value()函数的性能。
阅读:http://msdn.microsoft.com/en-us/library/bb522562.aspx
(2)XPath 1.0的=运算符以这种方式工作,尽管XPath 1.0不提供编写序列的语法。因此,如果您有一个格式为
的XML文档<doc>
<value>1</value>
<value>2</value>
<value>3</value>
</doc>
然后像//doc[value = 2]
这样的表达式将返回该doc元素。
在XPath 2.0中,语法(1,2,3)将创建一个包含三个整数的序列,您可以编写类似$i = (1, 2, 3)
的条件。但是文字序列不是XPath 1.0的一个特性 - 在XPath表达式的一侧获取多个值的唯一方法是使用匹配多个节点的路径表达式。