如何比较两个数字(两次)和 return XQuery 中的字符串
How to compare between two numbers (twice) and return a string in XQuery
我有一个酒吧数据库,我需要比较两个数字(纬度)和另外两个(经度),以及 return 位于这些坐标之间的每个酒吧名称。
我尝试了使用逻辑和算术运算符的 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(经度)和 return 名称之间的所有酒吧。
您当前正在使用 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
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
我有一个酒吧数据库,我需要比较两个数字(纬度)和另外两个(经度),以及 return 位于这些坐标之间的每个酒吧名称。
我尝试了使用逻辑和算术运算符的 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(经度)和 return 名称之间的所有酒吧。
您当前正在使用 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
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