Выражения с квантором (XQuery)
Кванторы существования и кванторы всеобщности указывают различную семантику для логических операторов, применяемых к двум последовательностям. Это показано ниже.
Квантор существования
Если имеются две последовательности и любой элемент первой последовательности имеет соответствующую пару во второй последовательности согласно используемому оператору сравнения, возвращаемым значением будет True.Квантор всеобщности
Если имеются две последовательности и любой элемент первой последовательности имеет соответствующую пару во второй последовательности, возвращаемым значением будет True.
XQuery поддерживает выражения с квантором в следующем виде:
( some | every ) <variable> in <Expression> (,…) satisfies <Expression>
Можно использовать эти выражения в запросе для явного применения квантификации существования или всеобщности к выражению в отношении одной или нескольких последовательностей. В SQL Server выражение в предложении satisfies должно привести к одному из следующих результатов: узловая последовательность, пустая последовательность или логическое значение. Действительное логическое значение результата этого выражения будет использовано в квантификации. Квантификация существования, использующая выражение some, возвращает True, если хотя бы одно из значений, связанных квантором, имеет результат True в выражении satisfy. Квантификация всеобщности, использующая выражение 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() method можно использовать value() method для возвращения результата в «реляционный мир», как показано в нижеследующем запросе. Запрос возвращает True, если все местоположения рабочих центров имеют атрибуты LocationID. В противном случае функция возвращает 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-формате содержал как минимум одно изображение маленького размера. Чтобы выполнить эту задачу, используется следующий запрос:
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
Ограничения реализации
Ниже приведены ограничения:
- Утверждение типов не поддерживается как часть привязки переменной в выражениях с квантором.