Postgresql, определите переменную box в функции - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь определить переменную box в функции PostgreSQL. Вот произвольная функция, которую я пробовал, и она не работает:

CREATE OR REPLACE FUNCTION "public"."find_centroid"("argbase_x" int8, "argbase_y" int8, "arg_length" int)
  RETURNS TABLE("cent_x" float8, "cent_y" float8) AS $BODY$
    DECLARE
    edge_x int8;
    edge_y int8;
    bounds text;
BEGIN
    edge_x := "argbase_x" + 5;
    edge_y := "argbase_y" + 5;  
    RETURN QUERY
    SELECT sum(location[0])/count("location") as cent_x, sum(location[1])/count("location") as cent_y 
from points
WHERE "location" <@ box'(("argbase_x","argbase_y"),("argbase_x"+"arg_length","argbase_y"+"arg_length"))';

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

Проблема заключается в том, как построить окно из аргументов box'(("argbase_x","argbase_y"),("argbase_x"+"arg_length","argbase_y"+"arg_length"))'

Я пробовал различныеметоды, такие как конкатенация строк, например. Но ничего не работает, и я не могу найти какие-либо ресурсы в Интернете, которые предлагают пример того, как объявить или определить геометрическую переменную в функции.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

После нескольких проб и ошибок. Это сработало для меня:

CREATE OR REPLACE FUNCTION "public"."find_centroid"("argbase_x" int8, "argbase_y" int8, "arg_length" int)
  RETURNS TABLE("cent_x" float8, "cent_y" float8) AS $BODY$
    DECLARE
    edge_x int8;
    edge_y int8;
    bounds text;
BEGIN
    edge_x := "argbase_x" + 5;
    edge_y := "argbase_y" + 5; 
    bounds := CONCAT('((',"argbase_x"::text,',',"argbase_y"::text,'), 
    RETURN QUERY
    SELECT sum(location[0])/count("location") as cent_x, sum(location[1])/count("location") as cent_y 
from points
WHERE "location" <@ box(bounds);

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
0 голосов
/ 10 октября 2019

вам не нужно определять какую-либо специальную «переменную блока», ограничивающий блок выполняется просто как x BETWEEN min_x AND max_x AND y BETWEEN min_y AND max_y

, если бы я правильно понял логику функции, это было бы

WHERE location[0] BETWEEN "argbase_x" AND "argbase_x"+"arg_length"
AND location[1] BETWEEN "argbase_y" AND "argbase_y"+"arg_length"

для более сложных фигур в Postgres нет встроенных операторов. Вам придется использовать нотацию WKT для построения ваших фигур и функции PostGIS для преобразования WKT в тип геометрии здесь и идентификации сдерживания или пересечения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...