Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ě expression1se 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