条件表达式 (XQuery)

适用范围:SQL Server

XQuery 支持以下条件 if-then-else 语句:

if (<expression1>)  
then  
  <expression2>  
else  
  <expression3>  

根据 expression1 的有效布尔值,选择计算 expression2expression3。 例如:

  • 如果测试表达式 expression1 结果为空序列,则结果为 False。

  • 如果测试表达式 expression1 结果为简单布尔值,则此值即为该表达式的结果。

  • 如果测试表达式 expression1 产生一个或多个节点的序列,则该表达式的结果为 True。

  • 否则,将引发静态错误。

还要注意以下几点:

  • 测试表达式必须用括号括起来。

  • 需要其他表达式。 如果不需要该表达式,可以返回“( )”,如本主题中的示例所示。

例如,针对 xml 类型变量指定以下查询。 if 条件使用 sql:variable() 函数扩展函数测试 XQuery 表达式中的 SQL 变量(@v)的值。 如果变量值为“FirstName”,则返回 <FirstName> 元素。 否则,它将返回 <LastName> 元素。

declare @x xml  
declare @v varchar(20)  
set @v='FirstName'  
set @x='  
<ROOT rootID="2">  
  <FirstName>fname</FirstName>  
  <LastName>lname</LastName>  
</ROOT>'  
SELECT @x.query('  
if ( sql:variable("@v")="FirstName" ) then  
  /ROOT/FirstName  
 else  
   /ROOT/LastName  
')  

结果如下:

<FirstName>fname</FirstName>  

以下查询从特定产品样式的产品目录说明中检索前两个功能说明。 如果文档中有更多功能,则添加一个 <there-is-more> 包含空内容的元素。

SELECT CatalogDescription.query('  
     declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     <Product>   
          { /p1:ProductDescription/@ProductModelID }  
          { /p1:ProductDescription/@ProductModelName }   
          {  
            for $f in /p1:ProductDescription/p1:Features/*[position()\<=2]  
            return  
            $f   
          }  
          {  
            if (count(/p1:ProductDescription/p1:Features/*) > 2)  
            then \<there-is-more/>  
            else ()  
          }   
     </Product>          
') as x  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

在上一个查询中,表达式中的条件检查是否存在两个以上的子元素><Features 如果有,则在结果中返回 \<there-is-more/> 元素。

结果如下:

<Product ProductModelID="19" ProductModelName="Mountain 100">  
  \<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    \<p1:WarrantyPeriod>3 years\</p1:WarrantyPeriod>  
    \<p1:Description>parts and labor\</p1:Description>  
  \</p1:Warranty>  
  \<p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    \<p2:NoOfYears>10 years\</p2:NoOfYears>  
    \<p2:Description>maintenance contract available through your dealer or any AdventureWorks retail store.\</p2:Description>  
  \</p2:Maintenance>  
  \<there-is-more />  
</Product>  

在以下查询中,如果工作中心位置未指定设置小时数, <Location> 则返回具有 LocationID 属性的元素。

SELECT Instructions.query('  
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
        for $WC in //AWMI:root/AWMI:Location  
        return  
        if ( $WC[not(@SetupHours)] )  
        then  
          <WorkCenterLocation>  
             { $WC/@LocationID }   
          </WorkCenterLocation>  
         else  
           ()  
') as Result  
FROM Production.ProductModel  
where ProductModelID=7  

结果如下:

<WorkCenterLocation LocationID="30" />  
<WorkCenterLocation LocationID="45" />  
<WorkCenterLocation LocationID="60" />  

可以在不使用 if 子句的情况下编写此查询,如以下示例所示:

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

另请参阅

XQuery 表达式