条件式 (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