Funciones usadas en valores booleanos: función not
Se aplica a:SQL Server
Devuelve TRUE si el valor booleano efectivo de $arg es false y devuelve FALSE si el valor booleano efectivo de $arg es true.
Sintaxis
fn:not($arg as item()*) as xs:boolean
Argumentos
$arg
Secuencia de elementos para los que existe un valor booleano efectivo.
Ejemplos
En este tema se proporcionan ejemplos de XQuery en instancias XML almacenadas en varias columnas de tipo xml de la base de datos AdventureWorks.
A. Con la función not() XQuery para buscar modelos de producto cuyas descripciones de catálogo no incluyan el <elemento Specifications> .
La consulta siguiente construye XML que contiene identificadores de modelo de producto para modelos de producto cuyas descripciones de catálogo no incluyen el <Specifications
> elemento .
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
Observe lo siguiente en la consulta anterior:
Dado que el documento utiliza espacios de nombres, en el ejemplo se utiliza la instrucción WITH NAMESPACES. Otra opción es usar la palabra clave declare namespace en XQuery Prolog para definir el prefijo.
A continuación, la consulta construye el XML que incluye el <
Product
> elemento y su atributo ProductModelID .La cláusula WHERE usa el método exist() (tipo de datos XML) para filtrar las filas. El método exist() devuelve True si hay <elementos ProductDescription> que no tienen <elementos secundarios Specification> . Anote el uso de la función not().
Este conjunto de resultados está vacío, ya que cada descripción del catálogo de modelos de producto incluye el <elemento Specifications> .
B. Usar la función not() de XQuery para recuperar ubicaciones de centros de trabajo que no contienen el atributo MachineHours.
La siguiente consulta se especifica para la columna Instructions. En esta columna, se almacenan las instrucciones de fabricación de los modelos de producto.
Para un modelo de producto determinado, la consulta recupera las ubicaciones de los centros de trabajo para las que no se ha especificado MachineHours. Es decir, el atributo MachineHours no se especifica para el <elemento Location> .
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
En la consulta anterior, observe lo siguiente:
El espacio declarenamespace en XQuery Prolog define el prefijo del espacio de nombres de instrucciones de fabricación de Adventure Works. Representa el mismo espacio de nombres utilizado en el documento de instrucciones de fabricación.
En la consulta, el predicado not(@MachineHours) devuelve True si no hay ningún atributo MachineHours .
El resultado es el siguiente:
ProductModelID Result
-------------- --------------------------------------------
7 <Location LocationID="30" LaborHrs="1"/>
<Location LocationID="50" LaborHrs="3"/>
<Location LocationID="60" LaborHrs="4"/>
Limitaciones de la implementación
Éstas son las limitaciones:
- La función not() solo admite argumentos de tipo xs:boolean o node()*, o la secuencia vacía.