LINUX.ORG.RU

а как сделать селект в базе по диапазону?

 


0

1

есть табличка, в ней числа от 0 до 100 например.

как выбрать то, что больше 15, но меньше 67 допустим?

вообще надо вот что, дана точка с координатами x y, координаты записаны в базе, надо выделить все точки, которые лежат в круге радиусом r, поле в базе содержит даные в виде (x, y) - user defined

и хотелось бы это сделать именно селектом, понятно чтоэто множество sqrt(x^2+y^2) < r



Последнее исправление: testing22 (всего исправлений: 1)

переформулирую

select data from rawdata where object='test' order by time

дает на выводе вот такую вот цифирь

.......... (5.84947098805899 , 0.460500275001892) (5.84939826600682 , 0.460505123138704) (5.84939826600682 , 0.460505123138704) ..........

поле data опеделено как USER-DEFINED

а как получить эти значения , допустим хочу отсортировать по первому числу:

При выполнении запроса 'select data from rawdata where object='test' order by data[0]' возникла ошибка: ERROR: cannot subscript type spoint because it is not an array

как добраться до первого или второго числа?

testing22
() автор топика

как выбрать то, что больше 15, но меньше 67 допустим?

SELECT .. FROM .. WHERE x>15 AND x <67

Сделай вьюху, которой выбери координаты в разные колонки. Приведённый пример распарсит координату вида (1,2) по колонкам x и y:

create view coordinates as
select
replace(substring_index(coordinate, ",", 1), "(", "") as x,
replace(substring_index(coordinate, ",", -1), ")", "") as y
from new_table;
Ну а дальше всё просто:
select * from coordinates
where
sqrt(power(x, 2)+power(y, 2))<=8

Если нужно работать с исходной таблицей, то можешь написать функцию, которая распарсит координату налету. Или парсить координаты в переменные и работать с ними.

ivn86
()
Ответ на: комментарий от ivn86

ошибку пишет:

imdata=# create view coordinates as select

imdata-# replace(substring_index(coordinate, ",", 1), "(", "") as x, replace(substring_index(coordinate, ",", -1), ")", "") as y from raw_data;

ERROR: zero-length delimited identifier at or near «„„“

LINE 2: replace(substring_index(coordinate, “,», 1), "(", "") as x, ... ^

=(

testing22
() автор топика
Ответ на: комментарий от testing22

ух жуть какая, но идею понял, спасибо, буду думать!

imdata=# create view coordinates as select replace(substring_index(coord2000, ',', 1), '(', ") as x, replace(substring_index(coord2000, ',', -1), ')', ") as y from raw_data;

ERROR: function substring_index(spoint, unknown, integer) does not exist

LINE 2: replace(substring_index(coord2000, ',', 1), '(', ") as x, ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.

imdata=#

testing22
() автор топика
Ответ на: комментарий от testing22

ошибку пишет

Ты не написал с какой СУБД работаешь, под рукой у меня был MySQL и я сбросил рабочий код конкретно для этой СУБД, чтобы ты понял идею (представить вьюхой данные в виде более удобном для обработки). Для других СУБД код будет другим, т.к. функции могут отличаться. Как тебе подсказали выше под Postgres есть встроенные функции для работы с координатами.

ivn86
()

понятно чтоэто множество sqrt(x^2+y^2) < r

Ты удивишься, но можно прямо такое условие и написать в запросе.

поле в базе содержит даные в виде (x, y) - user defined

Значит нужно сначала распарсить эти данные функциями БД.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

поле в базе содержит даные в виде (x, y) - user defined

Сделай уже `point '(x, y)'` и не знай проблем.

AnDoR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.