Các loại hình học có thể được nhập bằng nhiều cách.
-
Trong biểu mẫu đầu tiên,
?
của bạn các tham số không được thay thế bằng các giá trị vì chúng là các phần theo nghĩa đen của một chuỗi. Vì vậy, 0 tham số được mong đợi ... -
Trong biểu mẫu thứ hai không có dấu ngoặc kép,
?
của bạn các tham số được thay thế, nhưng((18.9750,72.8258), 5)
được hiểu là một loại hàng, không hoạt động vớicircle()
.
Bạn đang cố gọi hàm hình học circle()
cần một point
và double precision
("tâm và bán kính của hình tròn"). Đây là các biến thể cú pháp hợp lệ:
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 fiddle.
Truyền thành ::text
chỉ là để làm sạch màn hình lệch lạc trong SQL fiddle
Trong trường hợp của bạn, để cung cấp giá trị số (không phải là một chuỗi ký tự), hãy sử dụng biểu mẫu cuối cùng và nó sẽ hoạt động:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle(point(?,?), ?);
Nếu wso2dss (mà tôi không có kinh nghiệm) không chấp nhận các chức năng, bạn phải sử dụng một trong hai biểu mẫu đầu tiên và cung cấp một đơn tham số dưới dạng chuỗi ký tự:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ circle ?;
... trong đó tham số là ký tự được nối như hiển thị ở trên.
Bạn có thể hãy để Postgres thực hiện việc nối và vẫn chuyển ba giá trị số:
SELECT addressid, geocode
FROM maddress
WHERE geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle;