Operadores XQuery con el tipo de datos XML

XQuery admite los operadores siguientes:

  • Operadores numéricos (+, -, *, div, mod)

  • Operadores de comparación de valores (eq, ne, lt, gt, le, ge)

  • Operadores de comparación general ( =, !=, <, >, <=, >= )

Para obtener más información acerca de estos operadores, vea Expresiones de comparación (XQuery).

Ejemplos

A. Utilizar operadores generales

Esta consulta ilustra el uso de operadores generales que se aplican a secuencias y también para comparar secuencias. La consulta recupera una secuencia de números de teléfono para cada cliente de la columna AdditionalContactInfo de la tabla Person. Después, esta secuencia se compara con la secuencia de dos números de teléfono ("111-111-1111", "222-2222").

La consulta utiliza el operador de comparación =. Cada uno de los nodos de la secuencia al lado derecho del operador = se compara con cada uno de los nodos de la secuencia al lado izquierdo. Si los nodos coinciden, la comparación de los nodos es TRUE. Después, el valor se convierte a int y se compara con 1, y la consulta devuelve el Id. de cliente.

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS ACI,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)
SELECT BusinessEntityID 
FROM   Person.Person
WHERE  AdditionalContactInfo.value('
      //ACI:AdditionalContactInfo//ACT:telephoneNumber/ACT:number = 
          ("111-111-1111", "222-2222")',
      'bit')= cast(1 as bit);

Existe otra forma de observar el funcionamiento de la consulta anterior: cada valor de número de teléfono recuperado de la columna AdditionalContactInfo se compara con el conjunto de dos números de teléfono. Si el valor está en el conjunto, se devuelve ese cliente en el resultado.

B. Utilizar un operador numérico

El operador + de esta consulta es un operador de valor, porque se aplica a un solo elemento. Por ejemplo, el valor 1 se suma a un tamaño de lote devuelto por la consulta:

SELECT ProductModelID, Instructions.query('
     declare namespace 
 AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     for $i in (/AWMI:root/AWMI:Location)[1]
     return 
       <Location LocationID="{ ($i/@LocationID) }"
                   LotSize  = "{  number($i/@LotSize) }"
                   LotSize2 = "{ number($i/@LotSize) + 1 }"
                   LotSize3 = "{ number($i/@LotSize) + 2 }" >
                   
       </Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7;

C. Utilizar un operador de valor

La consulta siguiente recupera los elementos <Picture> de un modelo de producto donde el tamaño de la fotografía es "small":

SELECT CatalogDescription.query('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     for $P in /PD:ProductDescription/PD:Picture[PD:Size eq "small"]
     return
           $P
    ') as Result
FROM Production.ProductModel
where ProductModelID=19;

Dado que los dos operandos del operador eq son valores atómicos, en la consulta se utiliza el operador de valor. Se puede escribir la misma consulta utilizando el operador de comparación general (=).