Wyrażenia warunkowe (XQuery)
XQuery obsługuje następujące warunkowe if-then-else instrukcja:
if (<expression1>)
then
<expression2>
else
<expression3>
W zależności od skutecznego wartość typu logiczny expression1, albo expression2 lub expression3 sprawdzana jest zgodność. Na przykład:
Jeśli wyrażenie testowe expression1, wyniki w sekwencji pusta, wynik ma wartość FAŁSZ.
Jeśli wyrażenie testowe expression1, wyniki w prostym logiczny, wartość ta jest wynikiem wyrażenia.
Jeśli wyrażenie testowe expression1, wyniki w kolejności od jednego lub większą liczbę węzłów, wynikiem wyrażenia jest PRAWDA.
W przeciwnym razie błąd statycznego zostanie zaokrąglona.
Również należy pamiętać o następujących kwestiach:
Wyrażenie testowe muszą być ujęte w nawiasach.
The else wyrażenie is required. Jeśli nie ma potrzeby, można zwrócić "()", jak zostało to przedstawione w przykładach w tym temacie.
Na przykład, poniższa kwerenda jest określona względem xml Typ zmiennej. The if condition tests the value of the SQL variable (@v) inside the XQuery wyrażenie by using the sql:variable() funkcja extension funkcja.Jeśli wartość zmiennej jest "" imię", zwraca <FirstName> element. W przeciwnym razie zwraca <LastName> element.
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
')
To jest wynik:
<FirstName>fname</FirstName>
Następująca kwerenda pobiera pierwszy opisy dwóch funkcji z katalogu produktów opis określonego modelu produktu.Jeśli istnieje więcej funkcji w dokumencie, dodaje on <there-is-more> element z pustej zawartości.
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
W poprzedniej kwerendy warunek w if wyrażenie sprawdza, czy istnieją więcej niż dwóch elementów podrzędność <Features>. Jeśli tak, zwraca <there-is-more/> element w wyniku.
To jest wynik:
<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>
W następującej kwerendzie <Location> element z atrybut LocationID jest zwracana, jeśli lokalizacja środka pracy nie określa godziny instalacji.
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
To jest wynik:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Tę kwerendę mogą być zapisywane bez if Klauzula, jak pokazano w poniższym przykładzie:
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