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:
$variablerepresenta el elemento que se va a buscar.conditiones la expresión booleana que se evalúa para determinar si se incluye o no un elemento en el resultado.resultes 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
forpara seleccionar todos los elementoslibrodel documento mediante la expresión XPath//libro. - La cláusula
wherepara filtrar los libros cuyo precio es mayor a 50 euros. La expresión booleana$libro/precio > 50evalúa si el precio de cada libro es mayor a 50. - La cláusula
returnse 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
forpara seleccionar todos los elementosestudiantedel documento mediante la expresión XPath//estudiante. - La cláusula
wherepara filtrar los estudiantes cuyo promedio es mayor a8.5. La expresión booleana indicada a continuación delwherecalcula el promedio de calificaciones de cada estudiante usando la funciónavg()y evalúa si es mayor a8.5. - La cláusula
returnse 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
letpara declarar una variable$nque guarda el valor2. - La cláusula
wherepara filtrar si el valor de$nes mayor a1. - La cláusula
returnpara 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.