функция not (XQuery)

Возвращает значение TRUE, если действительное логическое значение $arg ложно, и значение FALSE, если действительное логическое значение $arg истинно.

Синтаксис

fn:not($arg as item()*) as xs:boolean

Аргументы

  • $arg
    Последовательность элементов, которым соответствует действительное логическое значение.

Примеры

В этом разделе приведены примеры запросов XQuery к экземплярам XML, которые хранятся в различных столбцах типа xml в базе данных AdventureWorks.

А.Использование функции XQuery not() для поиска моделей продуктов, описания которых в каталоге не содержат элемента <Specifications>.

В результате выполнения приведенного ниже запроса создается XML-документ, содержащий идентификаторы моделей продуктов, не содержащие элемент <Specifications>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
       <Product 
           ProductModelID="{ sql:column("ProductModelID") }"
        />
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
     /pd:ProductDescription[not(pd:Specifications/*)]  '
     ) = 0

В приведенном запросе обратите внимание на следующие моменты.

  • Так как в документе используются пространства имен, то в образце применяется инструкция WITH NAMESPACES. Чтобы определить префикс в Прологе XQuery, используется ключевое слово declare namespace.

  • В результате выполнения запроса создается XML-документ, включающий в себя элемент <Product> и его атрибут ProductModelID.

  • В предложении WHERE для фильтрации строк используется синтаксическая конструкция метод exist() (XML-данные). Метод exist() возвращает значение True в случае наличия элементов <ProductDescription>, не имеющих дочерних элементов с именем <Спецификации>. Отметим использование функции not().

Результирующий набор пуст, так как все каталоговые описания моделей продуктов содержат элемент <Спецификации>.

Б.Использование функции XQuery not() для получения информации о расположении цехов, не имеющих атрибута «MachineHours»

Следующий запрос адресован столбцу «Инструкции». В указанном столбце хранятся производственные инструкции для моделей продуктов.

Для любой модели продукта запрос извлекает информацию о расположении цехов, для которых не задан атрибут "MachineHours". Другими словами, извлекаются все элементы с именем <Расположение>, для которых не задан атрибут MachineHours.

SELECT ProductModelID, Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
     for $i in /AWMI:root/AWMI:Location[not(@MachineHours)]
     return
       <Location LocationID="{ $i/@LocationID }" 
                   LaborHrs="{ $i/@LaborHours }" >
        </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7 

В предыдущем запросе отметим следующее.

  • Синтаксическая конструкция declare пространство имен в Прологе XQuery задает префикс пространства имен для производственных инструкций в Adventure Works. Здесь представлено пространство имен, используемое в документе производственных инструкций.

  • В случае отсутствия атрибута MachineHours предикат not(@MachineHours) запроса возвращает значение True.

Ниже приведен результат.

ProductModelID Result 
-------------- --------------------------------------------
7              <Location LocationID="30" LaborHrs="1"/>
               <Location LocationID="50" LaborHrs="3"/>
               <Location LocationID="60" LaborHrs="4"/>

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

Существуют следующие ограничения.

  • Функция not() поддерживает только аргументы типа xs:boolean, node()*, а также пустые последовательности.

См. также

Справочник

Функции XQuery для типа данных xml