Condividi tramite


Espressioni di confronto (XQuery)

Si applica a: SQL Server

XQuery include i tipi di operatori di confronto seguenti:

  • Operatori di confronto generali

  • Operatori di confronto dei valori

  • Operatore di confronto dei nodi

  • Operatori di confronto dell'ordine dei nodi

Operatori di confronto generali

È possibile utilizzare gli operatori di confronto generali per confrontare valori atomici, sequenze o una combinazione dei due.

Gli operatori generali sono indicati nella tabella seguente.

Operatore Descrizione
= Equal
!= Diverso da
< Minore di
> Maggiore di
<= Minore di o uguale a
>= Maggiore di o uguale a

Quando si confrontano due sequenze utilizzando gli operatori di confronto generali e la seconda sequenza include un valore che risulta True in base al confronto con un valore della prima sequenza, il risultato complessivo è True. Negli altri casi, il risultato è False. Ad esempio, il risultato di (1, 2, 3) = (3, 4) è True, in quanto il valore 3 è incluso in entrambe le sequenze.

declare @x xml  
set @x=''  
select @x.query('(1,2,3) = (3,4)')    

Il confronto prevede che i valori siano paragonabili. In particolare, vengono sottoposti al controllo statico. Per i confronti numerici, può verificarsi la promozione del tipo numeric. Se ad esempio il valore decimal 10 viene confrontato con il valore double 1e1, il valore decimal viene convertito in double. Si noti che tale operazione potrebbe generare risultati imprecisi, in quanto i confronti tra valori double non possono essere esatti.

Se uno dei valori non è tipizzato, viene eseguito il relativo cast al tipo dell'altro valore. Nell'esempio seguente, il valore 7 viene considerato come valore intero. Prima del confronto, il valore /a[1] non tipizzato viene convertito in valore intero. Il confronto tra valori interi restituisce True.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < 7')  

Se invece il valore non tipizzato viene confrontato con una stringa o con un altro valore non tipizzato, verrà eseguito il relativo cast a xs:string. Nella query seguente, la stringa 6 viene confrontata con la stringa "17". Tale query restituisce False, a causa del confronto tra stringhe.

declare @x xml  
set @x='<a>6</a>'  
select @x.query('/a[1] < "17"')  

La query seguente restituisce foto di piccole dimensioni di un modello di prodotto derivato dal catalogo prodotti disponibile nel database di esempio AdventureWorks. La query confronta una sequenza di valori atomici restituiti da PD:ProductDescription/PD:Picture/PD:Size con la sequenza singleton "small". Se il confronto è True, restituisce l'elemento <Picture> .

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

La query seguente confronta una sequenza di numeri di telefono negli <elementi numerici> con il valore letterale stringa "112-111-1111". La query confronta la sequenza di elementi dei numeri di telefono nella colonna AdditionalContactInfo per determinare se il documento include un numero di telefono specifico di un determinato cliente.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.value('         
   /aci:AdditionalContactInfo//act:telephoneNumber/act:number = "112-111-1111"', 'nvarchar(10)') as Result         
FROM Person.Contact         
WHERE ContactID=1         

La query restituisce True. Questo valore indica che il documento contiene tale numero. La query seguente è una versione leggermente modificata della query precedente. In questa query, i valori dei numeri di telefono recuperati dal documento vengono confrontati con una sequenza costituita da due numeri telefonici. Se il confronto è True, viene restituito l'elemento <number> .

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('         
  if (/aci:AdditionalContactInfo//act:telephoneNumber/act:number = ("222-222-2222","112-111-1111"))         
  then          
     /aci:AdditionalContactInfo//act:telephoneNumber/act:number         
  else         
    ()') as Result         
FROM Person.Contact         
WHERE ContactID=1  
  

Risultato:

\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    111-111-1111  
\</act:number>  
\<act:number   
  xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
    112-111-1111  
\</act:number>   

Operatori di confronto dei valori

Gli operatori di confronto dei valori vengono utilizzati per confrontare valori atomici. Si noti che nelle query è possibile utilizzare gli operatori di confronto generali anziché gli operatori di confronto dei valori.

Gli operatori di confronto dei valori sono indicati nella tabella seguente.

Operatore Descrizione
eq Uguale
ne Diverso da
lt Minore di
gt Maggiore di
le Minore o uguale a
ge Maggiore o uguale a

Se i due valori confrontati soddisfano entrambi la condizione dell'operatore scelto, l'espressione restituirà True. In caso contrario, restituirà False. Se uno dei valori è una sequenza vuota, il risultato dell'espressione è False.

È possibile utilizzare questi operatori solo su valori atomici singleton. Pertanto, non è possibile specificare una sequenza come uno degli operandi.

Ad esempio, la query seguente recupera gli <elementi Picture> per un modello di prodotto in 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         

Dalla query precedente si noti quanto segue:

  • declare namespace definisce il prefisso dello spazio dei nomi utilizzato successivamente nella query.

  • Il valore dell'elemento <Size> viene confrontato con il valore atomico specificato, "small".

  • Si noti che poiché gli operatori valore funzionano solo su valori atomici, la funzione data() viene usata in modo implicito per recuperare il valore del nodo. Pertanto, data($P/PD:Size) eq "small" restituisce lo stesso risultato.

Risultato:

\<PD:Picture   
  xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">  
  \<PD:Angle>front\</PD:Angle>  
  \<PD:Size>small\</PD:Size>  
  \<PD:ProductPhotoID>31\</PD:ProductPhotoID>  
\</PD:Picture>  

Si noti che le regole per la promozione dei tipi sono identiche a quelle utilizzate per i confronti generali. SQL Server usa inoltre le stesse regole di cast per i valori non tipizzati durante i confronti di valori usati durante i confronti generali. Le regole delle specifiche XQuery, invece, prevedono sempre l'esecuzione del cast del valore non tipizzato a xs:string durante i confronti tra valori.

Operatore di confronto dei nodi

L'operatore di confronto dei nodi, è, si applica solo ai tipi di nodo. Il risultato restituito indica se due nodi passati come operandi rappresentano lo stesso nodo nel documento di origine. Questo operatore restituisce True se i due operandi rappresentano lo stesso nodo. In caso contrario, restituisce False.

La query seguente controlla se il centro di lavorazione 10 è il primo nell'ambito del processo di produzione di un modello di prodotto specifico.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions' AS AWMI)  
  
SELECT ProductModelID, Instructions.query('         
    if (  (//AWMI:root/AWMI:Location[@LocationID=10])[1]         
          is          
          (//AWMI:root/AWMI:Location[1])[1] )          
    then         
          <Result>equal</Result>         
    else         
          <Result>Not-equal</Result>         
         ') as Result         
FROM Production.ProductModel         
WHERE ProductModelID=7           

Risultato:

ProductModelID       Result          
-------------- --------------------------  
7              <Result>equal</Result>      

Operatori di confronto dell'ordine dei nodi

Gli operatori di confronto dell'ordine dei nodi confrontano coppie di nodi in base alle relative posizioni in un documento.

I confronti eseguiti, basati sull'ordine dei nodi all'interno del documento, sono i seguenti:

  • <<: operando 1 precede l'operando 2 nell'ordine del documento.

  • >>: operando 1 segue l'operando 2 nell'ordine del documento.

La query seguente restituisce True se la descrizione del catalogo prodotti contiene l'elemento <Warranty> visualizzato prima dell'elemento Maintenance> nell'ordine <del documento per un determinato prodotto.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS WM)  
  
SELECT CatalogDescription.value('  
     (/PD:ProductDescription/PD:Features/WM:Warranty)[1] <<   
           (/PD:ProductDescription/PD:Features/WM:Maintenance)[1]', 'nvarchar(10)') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

Dalla query precedente si noti quanto segue:

  • Il metodo value() del tipo di dati xmlviene utilizzato nella query.

  • Il risultato booleano della query viene convertito in nvarchar(10) e restituito.

  • La query restituisce True.

Vedi anche

Sistema di tipi (XQuery)
Espressioni XQuery