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

时间:2013-01-28 12:20:53

标签: 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
-- 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)

我收到以下错误:

ERROR: function expression in FROM cannot refer to other relations of same query level

确实有意义,因为我确实在x子句的两个部分都引用了FROM

子查询返回以下内容:

+----------------------------------+
|   |  wkb_geometry                |
|   |  geometry(MultiPolygon,4326) |
+---+------------------------------+
| 1 | some very long number here   |
+---+------------------------------+

我只是使用此参数来过滤我在函数中使用的记录列表。一种解决方案是创建一个包含已过滤记录的临时表并将其提供给函数,但如果有办法使用子查询,那就太棒了。

提前感谢您的回答。

2 个答案:

答案 0 :(得分:2)

为什么不这样:

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

或更简单的表单,没有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;

答案 1 :(得分:1)

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

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

相关问题