SEPERTI yang disebutkan @dezso, Anda memerlukan SQL dinamis dalam kasus ini.
SQL Dinamis dengan EXECUTE
Jadi, Anda berada di jalur yang benar; membentuk pernyataan SQL dinamis menggunakan PL/pgSQL, tetapi Anda hanya perlu sentuhan akhir:
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;
Saya yakin ini akan menyelesaikan masalah Anda.
Catatan:Kami menemukan kesalahan dengan solusi di atas dan menggunakan SETOF
, saya telah mencoba untuk memperbaiki masalah di bawah ini.
EDIT:
Beberapa pengeditan di sini, semoga satu solusi akan memperbaiki masalah Anda. Juga, mohon maafkan kesalahan sintaks dalam solusi saya sebelumnya &saat ini; Saya tidak punya waktu untuk menguji mereka sekarang. :(
1) Anda bisa mencoba mengembalikan SETOF
bilangan bulat, mengetahui bahwa tentu saja Anda hanya akan mengembalikan satu. Jenis pengembalian Anda dalam kasus ini akan menjadi satu baris satu kolom yang berisi bilangan bulat.
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;
lalu panggil sebagai:
SELECT * FROM convert_from_lon_lat(...);
2) Untuk secara khusus mengembalikan bilangan bulat, saya pikir Anda dapat mencoba ini:
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;