функция not (XQuery)

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

Синтаксис

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

Аргументы

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

Примеры

В этом разделе представлены примеры XQuery-запросов к экземплярам XML-данных, хранящимся в различных столбцах типа xml в базе данных База данных AdventureWorks2008R2. Обзор каждого из этих столбцов см. в разделе Представление типов данных XML в базе данных AdventureWorks2008R2.

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

В результате выполнения приведенного ниже запроса создается 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>, не имеющих дочерних элементов с именем <Specification>. Обратите внимание на использование функции 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 namespace в прологе XQuery задает префикс пространства имен для производственных инструкций в AdventureWorks. Здесь представлено пространство имен, используемое в документе производственных инструкций.

  • В случае отсутствия атрибута 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()*, а также пустые последовательности.

См. также

Справочник