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. Zum 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 auch Folgendes:
Der Testausdruck muss in Klammern stehen.
Der andere 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 wird beispielsweise für die XML-Typvariable angegeben. Die Bedingung testet den Wert der SQL-Variablen (@v) innerhalb des XQuery-Ausdrucks mithilfe der Sql:variable()-Funktionserweiterungsfunktion . Wenn der Variablewert "FirstName" lautet, 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 im Dokument weitere Features vorhanden sind, wird ein <there-is-more
> Element mit leerem 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 überprüft die Bedingung in dem Ausdruck , ob mehr als zwei untergeordnete Elemente vorhanden <Features
>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 Standort des Arbeitscenters die Einrichtungszeit 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 die 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