Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: SQL Server
XQuery поддерживает следующую условную инструкцию if-then-else :
if (<expression1>)
then
<expression2>
else
<expression3>
В зависимости от действительного логического значения вычисляется выражение expression1, expression2 или expression3. Например:
Если выражение условия
expression1соответствует пустой последовательности, результат имеет значение False.Если выражение
expression1соответствует простому логическому значению, оно и является результатом выражения.Если выражение
expression1соответствует последовательности из одного или более узлов, результатом выражения является значение True.иначе возникает статическая ошибка.
Также обратите внимание на следующее:
Выражение условия должно быть заключено в скобки.
Требуется другое выражение. Если оно не требуется, можно возвратить « ( ) », как показано в примерах, приведенных в этом подразделе.
Например, следующий запрос указывается для переменной типа XML . Если условие проверяет значение переменной SQL (@v) внутри выражения XQuery с помощью функции расширения функции sql:variable(). Если переменное имеет значение FirstName, он возвращает <FirstName> элемент. В противном случае возвращается <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
')
Результат:
<FirstName>fname</FirstName>
Следующий запрос получает описания первых двух характеристик конкретной модели продукции из каталога товаров. Если в документе есть больше возможностей, он добавляет <there-is-more> элемент с пустым содержимым.
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
В предыдущем запросе условие в выражении проверяет наличие более двух дочерних элементов.<Features> Если да, в результат запроса включается элемент \<there-is-more/>.
Результат:
<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>
В следующем запросе возвращается элемент с атрибутом LocationID, <Location> если расположение центра работы не указывает часы установки.
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
Результат:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Этот запрос можно записать без предложения if , как показано в следующем примере:
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