Clásula where
La cláusula where
se utiliza para filtrar los resultados producidos por las cláusulas for
y let
y limitarlos a aquellos elementos que cumplen ciertas condiciones especificadas en la consulta.
La sintaxis básica de la cláusula where
es la siguiente:
for $variable in //elemento
where condition
return result
donde:
$variable
representa el elemento que se va a buscar.condition
es la expresión booleana que se evalúa para determinar si se incluye o no un elemento en el resultado.result
es la información que se desea recuperar.
Utilizando where
con for
Cuando utilizamos where
con un for
, el where
está recibiendo una lista de elementos, los cuales recorreremos de forma individual. De esta forma, se evaluará la condición definida en el where
a cada uno de los elementos que se han obtenido de la expresión de la cláusula for
.
Consideremos la siguiente consulta:
for $libro in //libro
where $libro/precio > 50
return $libro/titulo
En este ejemplo, se utiliza:
- La cláusula
for
para seleccionar todos los elementoslibro
del documento mediante la expresión XPath//libro
. - La cláusula
where
para filtrar los libros cuyo precio es mayor a 50 euros. La expresión booleana$libro/precio > 50
evalúa si el precio de cada libro es mayor a 50. - La cláusula
return
se utiliza para recuperar el título de cada libro que cumple la condición evaluada en elwhere
.
Consideremos, ahora, la siguiente consulta:
for $estudiante in //estudiante
where avg($estudiante/calificaciones/calificación) > 8.5
return $estudiante/nombre
En este ejemplo, se utiliza:
- La cláusula
for
para seleccionar todos los elementosestudiante
del documento mediante la expresión XPath//estudiante
. - La cláusula
where
para filtrar los estudiantes cuyo promedio es mayor a8.5
. La expresión booleana indicada a continuación delwhere
calcula el promedio de calificaciones de cada estudiante usando la funciónavg()
y evalúa si es mayor a8.5
. - La cláusula
return
se utiliza para recuperar el nombre de cada estudiante que cumple la condición.
Utilizando where
con let
Cuando utilizamos where
con un let
, el where
está recibiendo un único elemento. Teniendo esto en cuenta, se evaluará la condición definida en el where
a toda la variable.
Consideremos la siguiente consulta:
let $n := 2
where $n > 1
return $n
En este ejemplo, se utiliza:
- La cláusula
let
para declarar una variable$n
que guarda el valor2
. - La cláusula
where
para filtrar si el valor de$n
es mayor a1
. - La cláusula
return
para recuperar el valor de$n
.
En este caso, el resultado de la consulta sería 2
.
Ahora, consideremos esta consulta:
let $n := 2
where $n < 1
return $n
Se ha modificado la expresión booleana dentro del where
. En este caso, al no cumplirse, no se devuelve nada.
No es posible utilizar where
junto con let
de la misma forma que se utiliza con for
cuando trabajamos con una lista de elementos.
Consideremos la siguiente consulta:
let $a := (1,2,3)
where $a>2
return $a
En este ejemplo, se podría pensar que se mostrarían aquellos elementos mayores a 2, pero no ocurre así: se devuelven todos los elementos porque ese es el valor de la variable $a
. Esto ocurre así porque el valor de la variable $a
se trata como un único valor.
Por último, consideremos la siguiente consulta:
let $nums := (1,2,3)
where count($nums) > 3
return $nums
En este caso, en el where
se están contando la cantidad de elementos que tiene la lista definida en $nums
mediante la función count()
. Pueden ocurrir dos situaciones:
- Si el recuento es mayor a 3, se muestra el valor de la variable
$nums
. - Si el recuento es 3 o menos, no se muestra nada.
En este caso, ocurre lo último.