Valor booleano efectivo (XQuery)

Éstos son los valores booleanos efectivos:

  • False si el operando es una secuencia vacía o un valor booleano false.

  • De lo contrario, el valor es true.

El valor booleano efectivo puede calcularse para expresiones que devuelven un único valor booleano, una secuencia de nodo o una secuencia vacía. Tenga en cuenta que el valor booleano se calcula de forma implícita, cuando se procesan los siguientes tipos de expresiones:

A continuación se muestra un ejemplo de un valor booleano efectivo. Cuando se procesa la expresión if, se determina el valor booleano efectivo de la condición. Como /a[1] devuelve una secuencia vacía, el valor booleano efectivo es false. El resultado se devuelve como XML con un nodo de texto (false).

value is false
DECLARE @x XML
SET @x = '<b/>'
SELECT @x.query('if (/a[1]) then "true" else "false"')
go

En el siguiente ejemplo, el valor booleano efectivo es true, porque la expresión devuelve una secuencia no vacía.

DECLARE @x XML
SET @x = '<a/>'
SELECT @x.query('if (/a[1]) then "true" else "false"')
go

Cuando se consultan columnas o variables xml con tipo, se pueden tener nodos de tipo booleano. En este caso, data() devuelve un valor booleano. Si la expresión de consulta devuelve un valor booleano true, el valor booleano efectivo será true, tal y como se muestra en el siguiente ejemplo. En el ejemplo también se ilustra lo siguiente:

  • Se crea una colección de esquemas XML. El elemento <b> de la colección es de tipo booleano.

  • Se crea una variable xml y se consulta.

  • La expresión data(/b[1]) devuelve un valor booleano true. Por tanto, el valor booleano efectivo en este caso es true.

  • La expresión data(/b[2]) devuelve un valor booleano false. Por tanto, el valor booleano efectivo en este caso es false.

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
      <element name="s" type="string"/>
      <element name="b" type="boolean"/>
</schema>'
go
DECLARE @x XML(SC)
SET @x = '<b>true</b><b>false</b>'
SELECT @x.query('if (data(/b[1])) then "true" else "false"')
SELECT @x.query('if (data(/b[2])) then "true" else "false"')
go