Поделиться через


Выражения с квантором (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      

Ограничения реализации

Ниже приведены ограничения:

  • Утверждение типов не поддерживается как часть привязки переменной в выражениях с квантором.

См. также

Основные понятия