Expresiones condicionales (XQuery)

Se aplica a:SQL Server

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.

También tenga en cuenta lo siguiente:

  • La expresión de prueba se debe escribir entre paréntesis.

  • Se requiere la expresión else . Si no la necesita, puede devolver " ( ) ", tal como se ilustra en los ejemplos de este tema.

Por ejemplo, la siguiente consulta se especifica en la variable de tipo xml . La condición if prueba el valor de la variable SQL (@v) dentro de la expresión XQuery mediante la función de extensión de función sql:variable(). Si el valor de la variable es "FirstName", devuelve el <FirstName> elemento . De lo contrario, devuelve el <LastName> elemento .

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 <there-is-more> elemento con contenido vacío.

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 <Location> elemento con un atributo LocationID si la ubicación del 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 , 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  

Consulte también

Expresiones XQuery