分享方式:


比較運算式 (XQuery)

適用於:SQL Server

XQuery 提供下列類型的比較運算子:

  • 一般比較運算子

  • 值比較運算子

  • 節點比較運算子

  • 節點順序比較運算子

一般比較運算子

一般比較運算子可用來比較不可部分完成的值、序列或兩者的任何組合。

下表定義一般運算子。

運算子 描述
= 等於
!= 不等於
< 小於
> 大於
<= 小於或等於
>= 大於或等於

當您使用一般比較運算子比較兩個序列,而第二個序列中存在比較 True 與第一個序列中的值時,整體結果為 True。 否則為 False。 例如,(1、2、3) = (3, 4) 為 True,因為值 3 會出現在這兩個序列中。

declare @x xml  
set @x=''  
select @x.query('(1,2,3) = (3,4)')    

比較預期這些值屬於可比較的類型。 具體而言,會以靜態方式檢查它們。 對於數值比較,可能會進行數值型別提升。 例如,如果 10 的十進位值與雙精度浮點數 1e1 相比較,則十進位值會變更為 double。 請注意,這可能會建立不精確的結果,因為雙重比較不精確。

如果其中一個值不具類型,則會轉換成另一個值的型別。 在下列範例中,值 7 會被視為整數。 比較之前,/a[1] 的不具類型值會轉換成整數。 整數比較會傳回 True。

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < 7')  

相反地,如果不具類型的值與字串或其他不具類型的值進行比較,則會轉換成 xs:string。 在下列查詢中,字串 6 會與字串 「17」 進行比較。 下列查詢會傳回 False,因為字串比較。

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < "17"')  

下列查詢會從 AdventureWorks 範例資料庫中提供的產品目錄傳回產品模型的小型圖片。 查詢會比較 所 PD:ProductDescription/PD:Picture/PD:Size 傳回的不可部分完成值序列與單一序列 「small」。 如果比較為 True,則會傳 < 回 Picture > 元素。

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

下列查詢會比較數位 > 元素中的 < 電話號碼序列與字串常值 「112-111-1111」。 查詢會比較 AdditionalContactInfo 資料行中的電話號碼元素序列,以判斷特定客戶的特定電話號碼是否存在於檔中。

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.value('         
   /aci:AdditionalContactInfo//act:telephoneNumber/act:number = "112-111-1111"', 'nvarchar(10)') as Result         
FROM Person.Contact         
WHERE ContactID=1         

查詢會傳回 True。 這表示檔中存在數位。 下列查詢是先前查詢稍微修改的版本。 在此查詢中,從檔擷取的電話號碼值會與兩個電話號碼值的序列進行比較。 如果比較為 True,則會 < 傳回 number > 元素。

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('         
  if (/aci:AdditionalContactInfo//act:telephoneNumber/act:number = ("222-222-2222","112-111-1111"))         
  then          
     /aci:AdditionalContactInfo//act:telephoneNumber/act:number         
  else         
    ()') as Result         
FROM Person.Contact         
WHERE ContactID=1  
  

以下是結果:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    112-111-1111  
\</act:number>   

值比較運算子

值比較運算子可用來比較不可部分完成的值。 請注意,您可以在查詢中使用一般比較運算子,而不是值比較運算子。

下表定義值比較運算子。

運算子 描述
eq 等於
ne 不等於
lt 小於
gt 大於
le 小於或等於
ge 大於或等於

如果兩個值會根據所選運算子比較相同,則運算式會傳回 True。 否則會傳回 False。 如果任一值是空序列,則運算式的結果為 False。

這些運算子僅適用于單一不可部分完成值。 也就是說,您無法將序列指定為其中一個運算元。

例如,下列查詢會 <> 擷取圖片大小為「小型」的產品模型圖片元素:

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         

請注意下列項目是從上一個查詢而來:

  • declare namespace 定義查詢中後續使用的命名空間前置詞。

  • <Size > 元素值會與指定的不可部分完成值 「small」 進行比較。

  • 請注意,因為值運算子只適用于不可部分完成的值, 因此 data() 函式會隱含地用來擷取節點值。 也就是說, data($P/PD:Size) eq "small" 會產生相同的結果。

以下是結果:

\<PD:Picture   
  xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
  \<PD:Angle>front\</PD:Angle>  
  \<PD:Size>small\</PD:Size>  
  \<PD:ProductPhotoID>31\</PD:ProductPhotoID>  
\</PD:Picture>  

請注意,值比較的類型升級規則與一般比較相同。 此外,SQL Server 會在值比較期間針對不具類型的值使用相同的轉換規則,因為它在一般比較期間使用。 相反地,XQuery 規格中的規則一律會在值比較期間,將不具類型的值轉換成 xs:string。

節點比較運算子

節點比較運算子 僅適用于 節點類型。 其傳回的結果會指出傳入做為運算元的兩個節點是否代表原始檔案中的相同節點。 如果兩個運算元是相同的節點,則此運算子會傳回 True。 否則會傳回 False。

下列查詢會檢查工作中心位置 10 是否為特定產品型號製造程式中的第一個位置。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS AWMI)  
  
SELECT ProductModelID, Instructions.query('         
    if (  (//AWMI:root/AWMI:Location[@LocationID=10])[1]         
          is          
          (//AWMI:root/AWMI:Location[1])[1] )          
    then         
          <Result>equal</Result>         
    else         
          <Result>Not-equal</Result>         
         ') as Result         
FROM Production.ProductModel         
WHERE ProductModelID=7           

以下是結果:

ProductModelID       Result          
-------------- --------------------------  
7              <Result>equal</Result>      

節點順序比較運算子

節點順序比較運算子會根據節點在檔中的位置來比較一組節點。

以下是根據檔順序進行的比較:

  • <<:運算元 1 在檔順序中運算元 2 之前

  • >>:運算元 1 是否 依檔順序遵循 運算元 2

如果產品類別目錄描述具有 < 出現在 > 特定產品檔順序中維護 > 元素之前 < ,則下列查詢會傳回 True。

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
  
SELECT CatalogDescription.value('  
     (/PD:ProductDescription/PD:Features/WM:Warranty)[1] <<   
           (/PD:ProductDescription/PD:Features/WM:Maintenance)[1]', 'nvarchar(10)') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

請注意下列項目是從上一個查詢而來:

  • xml 資料類型的 value() 方法會在查詢中使用。

  • 查詢的布林值結果會 轉換成 Nvarchar(10) 並傳回。

  • 查詢會傳回 True。

另請參閱

類型系統 (XQuery)
XQuery 運算式