Как сравнить два числа (дважды) и вернуть строку в XQuery - PullRequest
1 голос
/ 10 июня 2019

У меня есть база данных пабов, и мне нужно сравнить два числа (широта) и еще два (долгота) и вернуть каждое имя паба, которое находится между этими координатами.

Я пробовал предложение 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 ]

1 голос
/ 10 июня 2019

Решение от Мадс Хансен может быть сокращено до:

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
1 голос
/ 10 июня 2019

В настоящее время вы проверяете, равно ли значение широты двум различным строкам с критериями 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
...