我有以下功能:
DO
$do$
DECLARE
maxgid integer;
tableloop integer;
obstacle geometry;
simplifyedobstacle geometry;
BEGIN
select max(gid) from public.terrain_obstacle_temp into maxgid;
FOR tableloop IN 1 .. maxgid
LOOP
insert into public.terrain_obstacle (tse_coll,tse_height,geom) select tse_coll,tse_height,geom
from public.terrain_obstacle_temp where gid = tableloop;
END LOOP;
END
$do$;
我需要修改此函数,以便根据public.terrain_obstacle_temp
列的类型执行不同的查询。
这是一个通过读取shapefile创建的临时表,我需要知道该表的geom
列的类型。我有一个查询将数据提供给我:
SELECT type
FROM geometry_columns
WHERE f_table_schema = 'public'
AND f_table_name = 'terrain_obstacle'
and f_geometry_column = 'geom';
它返回character_varying
值(在本例中为MULTIPOLYGON
)。
我可以修改函数以获取查询结果,并创建一个if
语句,允许我根据该查询的结果执行一些代码吗?
答案 0 :(得分:1)
是否打算将临时表中的所有记录复制到实际表中?如果是这样,您可以跳过循环:
insert into public.terrain_obstacle (tse_coll, tse_height, geom)
select tse_coll, tse_height, geom
from public.terrain_obstacle_temp
;
terrain_obstacle
和terrain_obstacle_temp
具有相同的结构吗?如果是,那么"插入...选择..."如果列类型相同,应该可以正常工作。
如果需要条件输入,请使用CASE WHEN
语法:
v_type geometry_columns.type%TYPE;
...
SELECT type
INTO v_type
FROM geometry_columns
WHERE f_table_schema = 'public'
AND f_table_name = 'terrain_obstacle'
AND f_geometry_column = 'geom'
;
insert into public.terrain_obstacle (tse_coll, tse_height, geom)
select tse_coll
,tse_height
,CASE WHEN v_type = 'MULTIPOLYGON' THEN my_func1(geom)
WHEN v_type = 'POINT' THEN my_func2(geom)
ELSE my_default(geom)
END
from public.terrain_obstacle_temp
;