Wie @dezso erwähnte, benötigen Sie in diesem Fall dynamisches SQL.
Dynamisches SQL mit EXECUTE
Sie sind also auf dem richtigen Weg; Erstellen einer dynamischen SQL-Anweisung mit PL/pgSQL, aber Sie brauchen nur den letzten Schliff:
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;
Ich glaube, das sollte Ihre Probleme lösen.
Hinweis:Wir haben einen Fehler mit der obigen Lösung und der Verwendung von SETOF
entdeckt , ich habe versucht, die folgenden Probleme zu beheben.
BEARBEITEN:
Ein paar Änderungen hier, hoffentlich wird eine Lösung Ihr Problem beheben. Bitte entschuldigen Sie auch alle Syntaxfehler in meinen vorherigen und aktuellen Lösungen. Ich habe gerade keine Zeit sie zu testen. :(
1) Sie könnten einfach versuchen, ein SETOF
zurückzugeben Ganzzahlen, wobei Sie wissen, dass Sie natürlich nur die eine zurückgeben. Ihr Rückgabetyp ist in diesem Fall eine einzelne, einspaltige Zeile, die eine Ganzzahl enthält.
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;
und rufen Sie dann auf als:
SELECT * FROM convert_from_lon_lat(...);
2) Um speziell eine Ganzzahl zurückzugeben, können Sie Folgendes versuchen:
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;