量化式 (XQuery)
存在量化子と全称量化子により、2 つのシーケンスに適用されるブール演算子に異なるセマンティクスが指定されます。次に、各用語について説明します。
- 存在量化子
2 つのシーケンスがあるときに、最初のシーケンスの中に、使用される比較演算子に基づいて 2 番目のシーケンスと一致するアイテムがある場合、True が返されます。
- 全称量化子
2 つのシーケンスがあるときに、最初のシーケンスのすべてのアイテムが 2 番目のシーケンスと一致する場合、True が返されます。
XQuery では、次の形式の量化式がサポートされます。
( some | every ) <variable> in <Expression> (,…) satisfies <Expression>
これらの式をクエリで使用して、存在量化または全称量化を明示的に式の 1 つ以上のシーケンスに適用できます。SQL Server では、satisfies
句の式の結果が、ノード シーケンス、空のシーケンス、ブール値のいずれかになる必要があります。この式の結果の有効なブール値が、量化に使用されます。some を使用する存在量化では、量化子によりバインドされた値の少なくとも 1 つが充足式で True と評価された場合、True が返されます。every を使用する全称量化では、量化子によりバインドされたすべての値に対して結果が True である必要があります。
たとえば、次のクエリでは、すべての <Location> 要素に LocationID 属性が含まれているかどうかを確認します。
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
if (every $WC in //AWMI:root/AWMI:Location
satisfies $WC/@LocationID)
then
<Result>All work centers have workcenterLocation ID</Result>
else
<Result>Not all work centers have workcenterLocation ID</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=7
LocationID は <Location> 要素の必須属性であるため、予想どおりに次の結果が返されます。
<Result>All work centers have Location ID</Result>
query() メソッドを使用する代わりに、次のクエリに示すように value() メソッドを使用して、結果をリレーショナル形式で返すことができます。このクエリでは、すべてのワーク センターの場所に LocationID 属性が含まれている場合に True が返されます。それ以外の場合は False が返されます。
SELECT Instructions.value('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
every $WC in //AWMI:root/AWMI:Location
satisfies $WC/@LocationID',
'nvarchar(10)') as Result
FROM Production.ProductModel
where ProductModelID=7
次のクエリでは、製品の写真の中に小さいサイズの写真があるかどうかを確認します。製品カタログ XML には、さまざまな角度で撮影されたサイズの異なる製品の写真が格納されています。各製品カタログ XML にサイズの小さい写真が少なくとも 1 枚含まれているようにすることができます。これを行うには、次のクエリを実行します。
SELECT ProductModelID, CatalogDescription.value('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
some $F in /PD:ProductDescription/PD:Picture
satisfies $F/PD:Size="small"', 'nvarchar(20)') as SmallPicturesStored
FROM Production.ProductModel
WHERE ProductModelID = 19
次に結果の一部を示します。
ProductModelID SmallPicturesStored
-------------- --------------------
19 true
実装の制限事項
制限事項を次に示します。
- 量化式の変数をバインドする操作の一部として、型のアサーションはサポートされません。