2015-11-12 103 views
0

我必须将lat和long转换为geom才能使用PostGIS。我的问题是,我有来自不同位置的各种表格,我想将表格作为参数传递给函数。我试试这个:将表格作为参数传递

CREATE or REPLACE FUNCTION convert_from_lon_lat(float,float,character varying)  
RETURNS integer AS $$ 
select id from $3 as vertices 
order by vertices.geom <-> ST_SetSrid(ST_MakePoint($1,$2),4326) LIMIT 1; 
$$ LANGUAGE SQL; 

但我得到一个语法错误。

EDIT1:

所以我改变了以前的代码这样:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table character varying) RETURNS integer AS $$ 
BEGIN 
EXECUTE('select id from _table as vertices order by vertices.geom <-> ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;'); 
END; 
$$ LANGUAGE plpgsql; 

它创建没有任何问题,但是当我把它叫做'convert_from_lon_lat(long1,long2,MY_TABLE)

我得到和错误:

ERROR: relation "_table" does not exist 

它没有通过表名作为参数

编辑2:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, tbl character varying) RETURNS integer AS $func$ 
BEGIN 
EXECUTE format('select id from %s order by %s.the_geom <-> ST_SetSrid(ST_MakePoint('|| long || ','|| lat ||'),4326) LIMIT 1;', tbl, tbl); 
END; 
$func$ LANGUAGE plpgsql; 

现在,当我调用该函数,我得到一个'错误:控制达到的功能结束无RETURN``

我试图RETURN QUERY EXECUTE format('...但我得到一个ERROR: cannot use RETURN QUERY in a non-SETOF function

+0

您可能需要使用PL/pgSQL的和一个动态SQL构造。 – dezso

+0

我很喜欢postgres,我该怎么做? – tvieira

回答

1

AS @dezso提到,在这种情况下,您需要动态SQL。

动态SQL与EXECUTE

所以,你在正确的轨道上;形成使用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)你可以尝试返回一个整数,因为你知道当然只返回一个整数。这种情况下的返回类型将是一个包含整数的单列行。

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)要明确返回一个整数,我想你可以试试这个:

​​
+0

我更新了这个问题,我尝试了这个解决方案,并且出现了'错误:无法在非SETOF函数中使用RETURN QUERY' – tvieira

+0

因此,有两种可能的解决方案。我会尝试看看我是否可以进行适当的编辑... – Chris

+0

是的,它做到了!真棒 – tvieira