Typy geometryczne można wprowadzać na wiele sposobów.
-
W pierwszej formie Twój
?
parametry nie są zastępowane wartościami, ponieważ są to dosłowne części ciągu. Oczekuje się więc 0 parametrów ... -
W drugiej formie bez pojedynczych cudzysłowów Twój
?
parametry są zastępowane, ale((18.9750,72.8258), 5)
jest interpretowany jako typ wiersza, który nie działa zcircle()
.
Próbujesz wywołać funkcję geometryczną circle()
który zajmuje point
i double precision
(„środek i promień do okręgu”). Oto prawidłowe warianty składni:
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
Skrzypce SQL.
Rzut na ::text
jest tylko oczyszczenie obłąkanego wyświetlacza w skrzypcach SQL
W Twoim przypadku, aby podać wartości liczbowe (nie literał ciągu), użyj ostatniej formy i powinno działać:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle(point(?,?), ?);
Jeśli wso2dss (z którym nie mam doświadczenia) nie akceptuje funkcji, musisz użyć jednego z dwóch pierwszych formularzy i podać pojedynczy parametr jako literał ciągu:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle ?;
... gdzie parametr jest połączonym literałem, jak pokazano powyżej.
możesz pozwól Postgresowi wykonać konkatenację i nadal przekazywać trzy wartości liczbowe:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle;