Podmíněné výrazy (XQuery)
platí pro:SQL Server
XQuery podporuje následující podmíněný příkaz if-then-else:
if (<expression1>)
then
<expression2>
else
<expression3>
V závislosti na efektivní logické hodnotě expression1
se vyhodnotí expression2
nebo expression3
. Například:
Pokud testovací výraz
expression1
, výsledkem je prázdná sekvence, výsledek je False.Pokud testovací výraz,
expression1
, má za následek jednoduchou logickou hodnotu, tato hodnota je výsledkem výrazu.Pokud testovací výraz
expression1
, výsledkem je posloupnost jednoho nebo více uzlů, výsledek výrazu je True.V opačném případě se vyvolá statická chyba.
Všimněte si také těchto věcí:
Testovací výraz musí být uzavřený mezi závorky.
Je vyžadován výraz else. Pokud ho nepotřebujete, můžete vrátit " ( ) ", jak je znázorněno v příkladech v tomto tématu.
Například následující dotaz je zadán pro proměnnou typu xml.
, pokud podmínka testuje hodnotu proměnné SQL (@v) uvnitř výrazu XQuery pomocí funkce sql:variable() funkce rozšíření. Pokud je hodnota proměnné "FirstName", vrátí <FirstName
> element. V opačném případě vrátí prvek <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
')
Toto je výsledek:
<FirstName>fname</FirstName>
Následující dotaz načte první dva popisy funkcí z popisu katalogu produktů konkrétního modelu produktu. Pokud dokument obsahuje více funkcí, přidá prvek <there-is-more
> s prázdným obsahem.
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
V předchozím dotazu podmínka v , pokud výraz kontroluje, zda v <Features
>existují více než dva podřízené prvky . Pokud ano, vrátí \<there-is-more/>
prvek ve výsledku.
Toto je výsledek:
<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>
V následujícím dotazu se vrátí prvek <Location
> s atributem LocationID, pokud umístění pracovního centra nezadá dobu nastavení.
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
Toto je výsledek:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Tento dotaz lze zapsat bez , pokud klauzule, jak je znázorněno v následujícím příkladu:
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