Bedingte Ausdrücke (XQuery)
Gilt für:SQL Server
XQuery unterstützt die folgende bedingte 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.
Beispielsweise wird die folgende Abfrage für die variable xml-Typ angegeben. Die if-Bedingung testet den Wert der SQL-Variablen (@v) innerhalb des XQuery-Ausdrucks mithilfe der Funktionserweiterungsfunktion sql:variable(). Wenn der Variablenwert "FirstName" ist, gibt er das <FirstName
> -Element zurück. 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 Features enthält, fügt es ein <there-is-more
> Element mit leerem Inhalt hinzu.
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 überprüft die Bedingung im if-Ausdruck , ob mehr als zwei untergeordnete Elemente in <Features
>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 die Setupstunden nicht 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 ohne if-Klausel geschrieben werden, wie im folgenden Beispiel gezeigt:
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