postgresql - 将函数名作为参数传递

  显示原文与译文双语对照的内容

当我们试图处理PostGIS中的GEOMETRYCOLLECTION时,我发现这里的似乎把GEOMETRYCOLLECTION转换成简单几何,但是它只能与内部函数一起工作。

我相当懒惰,我认为让函数作为参数来执行是很好的,但它并不是这样工作的。


CREATE OR REPLACE FUNCTION ST_GeoCollConv_(geofunction, geometry, geometry) RETURNS boolean AS $$
 DECLARE
 is1collection boolean;
 is2collection boolean;
 BEGIN

 is1collection := GeometryType($1) = 'GEOMETRYCOLLECTION';
 is2collection := GeometryType($2) = 'GEOMETRYCOLLECTION';

 IF NOT is1collection AND NOT is2collection THEN
 return PERFORM geofunction($1, $2);
 END IF;


 IF NOT is1collection THEN
 FOR i IN 1..ST_NumGeometries($2) LOOP
 IF PERFORM geofunction($1, ST_GeometryN($2, i)) THEN
 RETURN true;
 END IF;
 END LOOP;
 ELSIF NOT is2collection THEN
 FOR i IN 1..ST_NumGeometries($1) LOOP
 IF PERFORM geofunction(ST_GeometryN($1, i), $2) THEN
 RETURN true;
 END IF;
 END LOOP;
 ELSE
 FOR i IN 1..ST_NumGeometries($1) LOOP
 IF ST_GeoCollConv_(geofunction, $1, $2) THEN
 RETURN true;
 END IF;
 END LOOP;
 END IF;

 RETURN false;

 END;
$$ LANGUAGE 'plpgsql';

我如何实现这个?

时间: 作者:

函数不是 postgres ( 我无法想到一个 RDBMS ) 中的一等公民,不能作为参数传递。 最接近的事情是枚举所有可能的函数( st_overlaps,st_intersects,st_within等),传递标志指示你正在讨论的函数,并在your语句overlaps如果 func ='内'和 st_within ( geom1,geom2 ) 。overlaps"。

几何集合可能有点令人沮丧,处理。 你是否被迫使用它们? 你能用多重多边形代替?

还要注意,函数本身有点过多。 你可以使用st_dump枚举所有几何图形,然后加入结果。 例如:


create or replace function st_intersects_gc(geometry, geometry)
returns boolean
as
$$
 select exists (
 select 1
 from st_dump($1) a
 join st_dump($2) b
 on st_intersects(a.geom, b.geom)
 limit 1
 )
 ;
$$
language sql
immutable
;

示例用法( 还应该有一个例子说明这个工作对于集合也是正确的,但我没有一个。):


-- returns false
select st_intersects_gc('POINT(0 0)'::geometry, 'LINESTRING ( 2 0, 0 2 )'::geometry)

-- returns true
select st_intersects_gc('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry)

在你的鞋子中,我会为你计划使用的每一个函数编写一个。

...