Bedingte Ausdrücke (XQuery)
XQuery unterstützt die folgende if-then-else-Anweisung:
if (<expression1>)
then
<expression2>
else
<expression3>
Abhängig vom effektiven booleschen Wert von expression1 wird entweder expression2 oder expression3 ausgewertet. Beispiel:
Wenn der Testausdruck expression1 eine leere Sequenz ergibt, ist das Ergebnis "False".
Wenn der Testausdruck expression1 einen einfachen booleschen Wert ergibt, gilt dieser Wert als Ergebnis des Ausdrucks.
Wenn der Testausdruck expression1 eine Sequenz aus einem oder mehreren Knoten ergibt, ist das Ergebnis des Ausdrucks "True".
Anderenfalls wird ein statischer Fehler ausgegeben.
Beachten Sie dabei außerdem Folgendes:
Der Testausdruck muss in Klammern stehen.
Der else-Ausdruck ist erforderlich. Falls Sie ihn nicht benötigen, können Sie " ( ) " zurückgeben, wie dies in den Beispielen der Fall ist.
Die folgende Abfrage erfolgt beispielsweise in Bezug auf die xml-Typvariable. Die if-Bedingung testet den Wert der SQL-Variablen (@v) des XQuery-Ausdrucks anhand der Erweiterungsfunktion sql:variable() function. Wenn der Variablenwert "FirstName" ist, wird das <FirstName>-Element zurückgegeben. Andernfalls wird das <LastName>-Element zurückgegeben.
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
')
Dies ist das Ergebnis:
<FirstName>fname</FirstName>
Die folgende Abfrage ruft die beiden ersten Funktionsbeschreibungen der Produktkatalogbeschreibung eines bestimmten Produktmodells ab. Wenn das Dokument weitere Funktionen enthält, wird ein <there-is-more>-Element ohne Inhalt hinzugefügt.
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
In der vorherigen Abfrage wird mit der Bedingung im if-Ausdruck überprüft, ob <Features> mehr als zwei untergeordnete Elemente enthält. Wenn dies der Fall ist, wird als Ergebnis ein <there-is-more/>-Element zurückgegeben.
Dies ist das Ergebnis:
<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>
In der folgenden Abfrage wird ein <Location>-Element mit einem LocationID-Attribut zurückgegeben, wenn die Setupzeiten vom Arbeitsplatzstandort nicht angegeben werden.
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
Dies ist das Ergebnis:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Diese Abfrage kann, wie im folgenden Beispiel, ohne if-Klausel geschrieben werden:
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