функция not (XQuery)
Возвращает значение TRUE, если действительное логическое значение $arg ложно, и значение FALSE, если действительное логическое значение $arg истинно.
Синтаксис
fn:not($arg as item()*) as xs:boolean
Аргументы
- $arg
Последовательность элементов, которым соответствует действительное логическое значение.
Примеры
В данном подразделе приведены примеры запросов XQuery, адресованных к экземплярам XML, которые хранятся в различных столбцах типа xml базы данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов XML-данных в базе данных AdventureWorks.
А. Использование функции 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>, не имеющих дочерних элементов с именем <Спецификации>. Отметим использование функции 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()*, а также пустые последовательности.