AS @dezso đã đề cập, bạn sẽ cần SQL động trong trường hợp này.
SQL động với EXECUTE
Vì vậy, bạn đang đi đúng hướng; tạo một câu lệnh SQL động bằng PL / pgSQL, nhưng bạn chỉ cần hoàn thiện:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
Tôi tin rằng điều này sẽ giải quyết được vấn đề của bạn.
Lưu ý:Chúng tôi đã phát hiện ra lỗi với giải pháp trên và sử dụng SETOF
, Tôi đã cố gắng sửa các vấn đề bên dưới.
CHỈNH SỬA:
Một vài chỉnh sửa ở đây, hy vọng một giải pháp sẽ khắc phục được sự cố của bạn. Ngoài ra, vui lòng bỏ qua bất kỳ lỗi cú pháp nào trong các giải pháp trước đây &hiện tại của tôi; Tôi không có thời gian để kiểm tra chúng ngay bây giờ. :(
1) Bạn chỉ có thể thử trả lại SETOF
số nguyên, biết rằng tất nhiên bạn sẽ chỉ trả về một. Khi đó, kiểu trả về của bạn trong trường hợp này sẽ là một hàng một cột, chứa một số nguyên.
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;
và sau đó gọi là:
SELECT * FROM convert_from_lon_lat(...);
2) Để trả về cụ thể một số nguyên, tôi nghĩ bạn có thể thử cách này:
CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text)
RETURNS integer AS $$
DECLARE
return_id integer;
BEGIN
EXECUTE format('SELECT id FROM %I AS vertices
ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table)
INTO return_id;
RETURN return_id;
END
$$ LANGUAGE plpgsql;