Condividi tramite


Operatori di XQuery per il tipo di dati xml

XQuery supporta gli operatori seguenti:

  • Operatori numerici (+, -, *, div, mod)

  • Operatori di confronto per i valori (eq, ne, lt, gt, le, ge)

  • Operatori di confronto generali ( =, !=, <, >, <=, >= )

Per ulteriori informazioni su questi operatori, vedere Espressioni di confronto (XQuery).

Esempi

A. Utilizzo degli operatori generali

La query seguente illustra l'utilizzo degli operatori generali validi per le sequenze e inoltre per le sequenze di confronto. La query recupera una sequenza di numeri di telefono per ogni cliente dalla colonna AdditionalContactInfo della tabella Person. La sequenza viene quindi confrontata con la sequenza di due numeri di telefono ("111-111-1111", "222-2222").

Nella query viene utilizzato l'operatore di confronto =. Ogni nodo della sequenza a destra dell'operatore = viene confrontato con ogni nodo della sequenza a sinistra dell'operatore. Se i nodi corrispondono, il confronto restituisce TRUE. Viene quindi convertito in un tipo di dati int e confrontato con 1, quindi la query restituisce l'ID del 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);

Esiste un altro modo per verificare il funzionamento della query precedente. Ogni numero di telefono recuperato dalla colonna AdditionalContactInfo viene confrontato con il set di due numeri di telefono. Se il numero è presente nel set, nel risultato viene restituito il cliente.

B. Utilizzo di un operatore numerico

L'operatore + nella query è un operatore per i valori, perché viene applicato a un singolo elemento. Ad esempio, il valore 1 viene aggiunto alle dimensioni di un lotto restituite dalla query:

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. Utilizzo di un operatore per valori

La query seguente recupera gli elementi <Picture> per un modello di prodotto per cui le dimensioni dell'immagine sono "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;

Poiché entrambi gli operandi dell'operatore eq sono valori atomici, nella query viene utilizzato l'operatore per valori. È possibile formulare la stessa query utilizzando l'operatore di confronto generale ( = ).