Postgresql 函数返回WHERE子句中的表,如何使用查询结果作为参数?

Postgresql 函数返回WHERE子句中的表,如何使用查询结果作为参数?,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,我有一个PL/pgSQL函数,它返回一个表,其定义如下: CREATE OR REPLACE FUNCTION get_movement_aggregation(movement_table varchar,place_table varchar,geom varchar,point_gid varchar, radius numeric DEFAULT 20000, inArea geometry DEFAULT NULL) RETURNS TABLE(place_i integer) AS

我有一个PL/pgSQL函数,它返回一个表,其定义如下:

CREATE OR REPLACE FUNCTION get_movement_aggregation(movement_table varchar,place_table varchar,geom varchar,point_gid varchar, radius numeric DEFAULT 20000, inArea geometry DEFAULT NULL)
RETURNS TABLE(place_i integer) AS
-- actual code here
现在我想通过使用从另一个表中获得的几何体(inArea参数)来使用这个函数。当我尝试以下查询时:

WITH x AS (
  SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1
)
SELECT g.* 
FROM x,
get_movement_aggregation('movements','places','geom','place_id',14000,x.wkb_geometry)
我得到以下错误:

错误:FROM中的函数表达式不能引用同一查询级别的其他关系

这是有道理的,因为我确实在FROM子句的
两部分中都提到了
x

子查询返回以下内容:

+----------------------------------+
|   |  wkb_geometry                |
|   |  geometry(MultiPolygon,4326) |
+---+------------------------------+
| 1 | some very long number here   |
+---+------------------------------+
我只是用这个参数来过滤我在函数中处理的记录列表。一种解决方案是创建一个带有过滤记录的临时表,并将其提供给函数,但如果有一种方法可以通过子查询实现这一点,那就太好了

提前感谢您的回答。

为什么不:

或者更简单的形式,没有
WITH
子句:

SELECT 
get_movement_aggregation('movements','places',
                         'geom','place_id',14000,x2.wkb_geometry)
FROM (SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2
或者,如果您希望在最终选择列表中使用显式字段而不是函数调用:

SELECT g.* FROM 
 (SELECT get_movement_aggregation('movements','places',
                                  'geom','place_id',14000,x2.wkb_geometry)
    FROM (SELECT wkb_geometry from tha_adm1 
           WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2
 ) as g;
为什么不这样做:

或者更简单的形式,没有
WITH
子句:

SELECT 
get_movement_aggregation('movements','places',
                         'geom','place_id',14000,x2.wkb_geometry)
FROM (SELECT wkb_geometry from tha_adm1 
  WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2
或者,如果您希望在最终选择列表中使用显式字段而不是函数调用:

SELECT g.* FROM 
 (SELECT get_movement_aggregation('movements','places',
                                  'geom','place_id',14000,x2.wkb_geometry)
    FROM (SELECT wkb_geometry from tha_adm1 
           WHERE name_1 = 'Ubon Ratchathani' LIMIT 1) as x2
 ) as g;

这种形式的查询在SQL标准中称为
LATERAL
。 PostgreSQL 9.3中提供了对此类查询的支持,您可以通过@depesz找到


在此之前,您必须使用子查询,@Daniel概述了一系列可能性。

这种形式的查询在SQL标准中称为
LATERAL
。 PostgreSQL 9.3中提供了对此类查询的支持,您可以通过@depesz找到


在此之前,你必须使用子查询,@Daniel概述了一系列可能性。

可能实际上与这个问题类似:可能实际上与这个问题类似:是的,我在另一个答案上读过这个,我也读过评论。谢谢大家!@丹尼尔帮我得到了我想要的结果。是的,我在另一个答案上读过这个,我也读过评论。谢谢大家!@丹尼尔帮助我得到了我想要的结果。答案被接受。因此,诀窍是将函数调用放入
SELECT
。。。对返回表的函数并不十分熟悉。谢谢你!!!答案被接受。因此,诀窍是将函数调用放入
SELECT
。。。对返回表的函数并不十分熟悉。谢谢你!!!