Postgresql 函数返回WHERE子句中的表,如何使用查询结果作为参数?
我有一个PL/pgSQL函数,它返回一个表,其定义如下: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
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
。。。对返回表的函数并不十分熟悉。谢谢你!!!