如何在两个数字之间进行比较(两次)并在XQuery中返回字符串

时间:2019-06-09 23:28:01

标签: xquery basex

我有一个pub数据库,我需要比较两个数字(纬度)和另外两个(经度),并返回位于这些坐标之间的每个pub名称。

我尝试了同时使用逻辑和算术运算符的where子句,并尝试了一个变量和两个变量。

所有酒吧的输出始终相同,无论坐标如何。

for $x in db:open("pub", "pub.xml")/serviceList/service
where $x/geoData/latitude='40.400000000000' and $x/geoData/latitude='40.410000000000'
return $x/basicData/name

这个想法是让数据库循环查找所有坐标在40.40至40.41(纬度)和-3.7 i -3.71(经度)之间的酒吧,并返回名称。

2 个答案:

答案 0 :(得分:1)

您当前正在测试and条件下的纬度值是否等于两个不同的字符串(除非存在多个纬度元素,否则它将永远不会匹配两个值,但是您没有显示示例XML)

您可能想将这些经度和纬度值比较为数字(从值中删除引号)

for $x in db:open("pub", "pub.xml")/serviceList/service
where (
  $x/geoData/latitude >= 40.4 and $x/geoData/latitude <= 40.41
  and 
  $x/geoData/longitude >= -3.7 and $x/geoData/latitude <= 3.7
)
return $x/basicData/name

答案 1 :(得分:1)

Mads Hansen的解决方案可以缩写为:

for $x in db:open("pub", "pub.xml")/serviceList/service
where (
  $x/geoData/latitude[. ge 40.4 and . le 40.41]
  and 
  $x/geoData/longitude[. ge -3.7 and . le 3.7]
)
return $x/basicData/name

甚至进一步

db:open("pub", "pub.xml")/serviceList/service
    [geoData[latitude[. ge 40.4 and . le 40.41] and longitude[. ge -3.7 and . le 3.7]]
    /basicData/name