postgres-error: функция st_intersects (география, география, целое число) не существует

У меня есть таблица business_locations со столбцом местоположения postGIS, и я пытаюсь получить строки, которые находятся в ограничивающей рамке (аргументы функции).

Я пытаюсь запустить эту функцию в Хасуре:

CREATE OR REPLACE FUNCTION search_businesses_near_project(lngW integer, latS integer, lngE integer, latN integer)
RETURNS SETOF business_locations AS $$
  SELECT  A.location, A.route, A.locality, A.administrative_area_level_1, A.administrative_area_level_2, A.country, A.business_id
  FROM business_locations A where ST_Intersects(A.location::geography, ST_MakeEnvelope(lngW, latS, lngE, latN, 4326)::geography, 4326)
$$ LANGUAGE sql STABLE;

Возвращена ошибка:

{
    "internal": {
        "statement": "CREATE OR REPLACE FUNCTION search_businesses_near_project(project_location geography, lngW integer, latS integer, lngE integer, latN integer)\r\nRETURNS SETOF business_locations AS $$\r\n  SELECT  A.location, A.route, A.locality, A.administrative_area_level_1, A.administrative_area_level_2, A.country, A.business_id\r\n  FROM business_locations A where ST_Intersects(project_location, ST_MakeEnvelope(lngW, latS, lngE, latN, 4326)::geography, 4326)\r\n$$ LANGUAGE sql STABLE;",
        "prepared": false,
        "error": {
            "exec_status": "FatalError",
            "hint": "No function matches the given name and argument types. You might need to add explicit type casts.",
            "message": "function st_intersects(geography, geography, integer) does not exist",
            "status_code": "42883",
            "description": null
        },
        "arguments": []
    },
    "path": "$.args[0].args",
    "error": "query execution failed",
    "code": "postgres-error"
}

person Constantinos N    schedule 12.06.2020    source источник


Ответы (1)


st_intersects принимает только два аргумента. Опускаем лишний SRID:

CREATE OR REPLACE FUNCTION search_businesses_near_project(
   lngW integer,
   latS integer,
   lngE integer,
   latN integer
) RETURNS SETOF business_locations AS $$
   SELECT *
   FROM business_locations A
   WHERE st_intersects(
            A.location::geography,
            ST_MakeEnvelope(lngW, latS, lngE, latN, 4326)::geography
   )
$$ LANGUAGE sql STABLE;
person Laurenz Albe    schedule 12.06.2020
comment
Спасибо, это работает, но теперь я получаю эту ошибку: «message: несоответствие типа возврата в функции, объявленной для возврата business_locations, status_code: 42P13, description: Final statement возвращает слишком мало столбцов». Разве нельзя вернуть только несколько столбцов? Я тоже их все вернул? - person Constantinos N; 12.06.2020
comment
Правильно отразите результат: SELECT ROW(a.location, a.route, ...)::business_locations - person Laurenz Albe; 12.06.2020
comment
Не работает. Я получаю Cannot cast type geography to uuid in column 1. Я использовал SELECT ROW(a.location, a.business_id)::business_locations. Первый столбец в таблице business_locations относится к типу uuid и называется id. - person Constantinos N; 12.06.2020
comment
Тогда вам следует RETURN business_locations FROM business_locations WHERE .... - person Laurenz Albe; 12.06.2020
comment
В Hasura вы можете вернуть только SETOF, так что, возможно, это невозможно. Я не могу точно сказать, потому что я новичок в postgres. hasura.io/docs/1.0/graphql/manual/schema/ custom-functions.html - person Constantinos N; 12.06.2020
comment
Я добавил к ответу полную функцию. - person Laurenz Albe; 12.06.2020
comment
На самом деле это неправильно. Он должен быть SELECT business_locations.*, иначе он не работает. Вместо этого я также вернул представление, чтобы получить именно те столбцы, которые мне нужны. Таким образом я также получаю столбцы из других таблиц. - person Constantinos N; 12.06.2020