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. Anderenfalls 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 Featurebeschreibungen der Produktkatalogbeschreibung eines bestimmten Produktmodells ab. Wenn mehr Features im Dokument enthalten sind, wird ein leeres <there-is-more>-Element 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 obigen Abfrage prüft die Bedingung des if-Ausdrucks, ob in <Features> mehr als zwei untergeordnete Elemente vorhanden sind. 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 der Arbeitsplatzstandort keine Rüstzeiten angibt.
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