Espressioni condizionali (XQuery)
Si applica a: SQL Server
XQuery supporta l'istruzione if-then-else condizionale seguente:
if (<expression1>)
then
<expression2>
else
<expression3>
In base al valore booleano effettivo di expression1
, viene valutata expression2
oppure expression3
. Ad esempio:
Se l'espressione di test
expression1
restituisce una sequenza vuota, il risultato è False.Se l'espressione di test
expression1
restituisce un valore booleano semplice, tale valore è il risultato dell'espressione.Se l'espressione di test
expression1
restituisce una sequenza di uno o più nodi, il risultato dell'espressione è True.Negli altri casi, viene restituito un errore statico.
Tieni inoltre presente quanto segue:
L'espressione di test deve essere racchiusa tra parentesi.
L'espressione else è obbligatoria. Se non è necessaria, è possibile restituire " ( ) ", come illustrato negli esempi disponibili in questa sezione.
Ad esempio, la query seguente viene specificata sulla variabile di tipo xml . La condizione if verifica il valore della variabile SQL (@v) all'interno dell'espressione XQuery usando la funzione di estensione della funzione sql:variable(). Se il valore della variabile è "FirstName", restituisce l'elemento <FirstName
> . In caso contrario, restituisce l'elemento <LastName
> .
declare @x xml
declare @v varchar(20)
set @v='FirstName'
set @x='
<ROOT rootID="2">
<FirstName>fname</FirstName>
<LastName>lname</LastName>
</ROOT>'
SELECT @x.query('
if ( sql:variable("@v")="FirstName" ) then
/ROOT/FirstName
else
/ROOT/LastName
')
Risultato:
<FirstName>fname</FirstName>
La query seguente recupera le prime due descrizioni di caratteristiche dalla descrizione di catalogo di uno specifico modello di prodotto. Se nel documento sono presenti più funzionalità, aggiunge un <there-is-more
> elemento con contenuto vuoto.
SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product>
{ /p1:ProductDescription/@ProductModelID }
{ /p1:ProductDescription/@ProductModelName }
{
for $f in /p1:ProductDescription/p1:Features/*[position()\<=2]
return
$f
}
{
if (count(/p1:ProductDescription/p1:Features/*) > 2)
then \<there-is-more/>
else ()
}
</Product>
') as x
FROM Production.ProductModel
WHERE ProductModelID = 19
Nella query precedente, la condizione nell'espressione if controlla se sono presenti più di due elementi figlio in <Features
>. In caso affermativo, restituisce l'elemento \<there-is-more/>
nel risultato.
Risultato:
<Product ProductModelID="19" ProductModelName="Mountain 100">
\<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
\<p1:WarrantyPeriod>3 years\</p1:WarrantyPeriod>
\<p1:Description>parts and labor\</p1:Description>
\</p1:Warranty>
\<p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
\<p2:NoOfYears>10 years\</p2:NoOfYears>
\<p2:Description>maintenance contract available through your dealer or any AdventureWorks retail store.\</p2:Description>
\</p2:Maintenance>
\<there-is-more />
</Product>
Nella query seguente viene restituito un <Location
> elemento con un attributo LocationID se la posizione del centro di lavoro non specifica le ore di installazione.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in //AWMI:root/AWMI:Location
return
if ( $WC[not(@SetupHours)] )
then
<WorkCenterLocation>
{ $WC/@LocationID }
</WorkCenterLocation>
else
()
') as Result
FROM Production.ProductModel
where ProductModelID=7
Risultato:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Questa query può essere scritta senza la clausola if , come illustrato nell'esempio seguente:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in //AWMI:root/AWMI:Location[not(@SetupHours)]
return
<Location>
{ $WC/@LocationID }
</Location>
') as Result
FROM Production.ProductModel
where ProductModelID=7