针对 xml 数据类型的 XQuery 运算符

XQuery 支持下列运算符:

  • 数字运算符(+、-、*、div、mod)

  • 值比较运算符(eq、ne、lt、gt、le、ge)

  • 一般比较运算符(=、!=、<、>、<=、>=)

有关这些运算符的详细信息,请参阅比较表达式 (XQuery)

示例

A. 使用一般运算符

此查询说明了应用于序列和比较序列的一般运算符的使用方法。此查询将检索 Person 表的 AdditionalContactInfo 列中的每个客户的电话号码序列。然后,将这个序列与两个电话号码(“111-111-1111”、“222-2222”)序列进行比较。

查询使用 = 比较运算符。= 运算符右侧序列中的每个节点都将与左侧序列中的每个节点进行比较。如果节点匹配,则节点比较结果为 TRUE。然后将其转换为整数并与 1 进行比较,然后查询将返回客户 ID。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS ACI,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)
SELECT BusinessEntityID 
FROM   Person.Person
WHERE  AdditionalContactInfo.value('
      //ACI:AdditionalContactInfo//ACT:telephoneNumber/ACT:number = 
          ("111-111-1111", "222-2222")',
      'bit')= cast(1 as bit);

有另一种方法可观察上一个查询是如何进行的:将 AdditionalContactInfo 列中检索到的每个电话号码值与两个电话号码集进行比较。如果该值处于集中,则该客户将返回到结果中。

B. 使用数字运算符

此查询中的运算符 + 是一个值运算符,因为它应用于单个项。例如,将值 1 添加到查询返回的许多大小值上:

SELECT ProductModelID, Instructions.query('
     declare namespace 
 AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     for $i in (/AWMI:root/AWMI:Location)[1]
     return 
       <Location LocationID="{ ($i/@LocationID) }"
                   LotSize  = "{  number($i/@LotSize) }"
                   LotSize2 = "{ number($i/@LotSize) + 1 }"
                   LotSize3 = "{ number($i/@LotSize) + 2 }" >
                   
       </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7;

C. 使用值运算符

下列查询将检索图片大小为“小”的产品型号的 <Picture> 元素:

SELECT CatalogDescription.query('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]
     return
           $P
    ') as Result
FROM Production.ProductModel
where ProductModelID=19;

因为 eq 运算符的两个操作数都是原子值,所以在查询中使用了值运算符。可以使用一般比较运算符 (=) 编写相同的查询。