次の方法で共有


条件式 (XQuery)

適用対象:SQL Server

XQuery では、次の条件 if-then-else ステートメントが サポートされています。

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

の有効なブール値expression1に応じて、 または expression3 のいずれかがexpression2評価されます。 次に例を示します。

  • テスト式 expression1 の結果が空のシーケンスになった場合、結果は False になります。

  • テスト式 expression1が単純なブール値になる場合、この値は式の結果になります。

  • テスト式 expression1 の結果が複数ノードのシーケンスになった場合、式の結果は True になります。

  • それ以外の場合は、静的エラーが発生します。

また、以下の点にも注意してください。

  • テスト式は、かっこで囲む必要があります。

  • else 式が必要です。 不要な場合は、このトピックの例に示すように、 " ( ) "を返すことができます。

たとえば、 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>  

次のクエリでは、特定の製品モデルの製品カタログの説明から最初の 2 つの機能の説明を取得します。 ドキュメントにさらに機能がある場合は、空のコンテンツを含む要素が <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  

前のクエリの if 式の条件は、 に 2 つ以上の子要素 <Features>があるかどうかをチェックします。 3 つ以上ある場合は、結果に \<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 式