Expresiones condicionales (XQuery)
XQuery admite la siguiente instrucción if-then-else condicional:
if (<expression1>)
then
<expression2>
else
<expression3>
Según el valor booleano efectivo de expression1, se evalúa expression2 o expression3. Por ejemplo:
Si la expresión de prueba expression1 da como resultado una secuencia vacía, el resultado será False.
Si la expresión de prueba expression1 da como resultado un valor booleano simple, este valor será el resultado de la expresión.
Si la expresión de prueba expression1 da como resultado una secuencia de uno o varios nodos, el resultado de la expresión será True.
De lo contrario, se generará un error estático.
Considere también los siguientes aspectos:
La expresión de prueba se debe escribir entre paréntesis.
La expresión else es obligatoria. Si no la necesita, puede devolver " ( ) ", tal como se ilustra en los ejemplos de este tema.
Por ejemplo, la consulta siguiente se especifica con la variable de tipo xml. La condición if prueba el valor de la variable de SQL (@v) en la expresión XQuery mediante la función de extensión sql:variable(). Si el valor de la variable es "FirstName", devolverá el elemento <FirstName>. De lo contrario, devolverá el elemento <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
')
El resultado es el siguiente:
<FirstName>fname</FirstName>
La consulta siguiente recupera las dos primeras descripciones de características de la descripción del catálogo de productos de un modelo de producto determinado. Si hay más características en el documento, agrega un elemento <there-is-more> sin contenido.
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
En la consulta anterior, la condición de la expresión if comprueba si hay más de dos elementos secundarios en <Features>. Si éste es el caso, devuelve el elemento <there-is-more/> en el resultado.
El resultado es el siguiente:
<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>
En la consulta siguiente, se devuelve un elemento <Location> con un atributo LocationID si la ubicación de centro de trabajo no especifica las horas de instalación.
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
El resultado es el siguiente:
<WorkCenterLocation LocationID="30" />
<WorkCenterLocation LocationID="45" />
<WorkCenterLocation LocationID="60" />
Esta consulta se puede escribir sin la cláusula if, tal como se muestra en el ejemplo siguiente:
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