@dezsoが述べたように、この場合は動的SQLが必要になります。
EXECUTE
を使用した動的SQL
ですから、あなたは正しい方向に進んでいます。 PL / pgSQLを使用して動的SQLステートメントを作成しますが、最後の仕上げが必要です。
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;
これで問題が解決すると思います。
注:上記のソリューションでSETOF
を使用するとエラーが見つかりました 、以下の問題を修正しようとしました。
編集:
ここでいくつかの編集を行います。うまくいけば、1つの解決策で問題が解決します。また、以前および現在のソリューションの構文エラーをお許しください。今はテストする時間がありません。 :(
1) SETOF
を返してみてください。 整数、もちろんあなたは1つだけを返すことを知っています。この場合の戻りタイプは、整数を含む単一の1列の行になります。
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;
次に、次のように呼び出します:
SELECT * FROM convert_from_lon_lat(...);
2) 具体的に整数を返すには、これを試すことができると思います:
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;