Геометрични типове може да се въведе по много начини.
-
В първата форма вашият
?
параметрите не се заменят със стойности, защото те са буквални части от низ. Така че се очакват 0 параметри ... -
Във втората форма без единични кавички, вашият
?
параметрите са заменени, но((18.9750,72.8258), 5)
се интерпретира като тип ред, който не работи сcircle()
.
Опитвате се да извикате геометричната функция circle()
който отнема point
и double precision
("център и радиус на окръжност"). Това са валидни варианти на синтаксис:
SELECT circle '((18.9750,72.8258), 5)' AS cast_literal
' <(18.9750,72.82580),5>'::circle AS cast_literal2
, circle(point '(18.9750,72.8258)', '5') AS literal_point_n_radius
, circle(point(18.9750,72.8258), '5') AS point_n_literal_radius
, circle(point(18.9750,72.8258), 5) AS point_n_radius
SQL цигулка.
Прехвърлянето към ::text
е просто да дезинфекцира неправилния дисплей в SQL fiddle
Във вашия случай, за предоставяне на числови стойности (не е низов литерал), използвайте последната форма и трябва да работи:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle(point(?,?), ?);
Ако wso2dss (с който нямам опит) не приема функции, трябва да използвате една от първите две форми и да предоставите single параметър като низов литерал:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle ?;
... където параметърът е свързаният литерал, както е показано по-горе.
Вие можете оставете Postgres да направи конкатенацията и пак да предаде три числови стойности:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle;