Postgresql 使用Pl/pgSQL向循环中的查询传递参数
我正在尝试创建一个参数化查询,该查询将使用plpgsql在循环中执行 这两个参数将是传递到查询中的起始纬度/经度点。纬度和经度点将从一个数组中检索,因此它将是一个类似于foreach的迭代,在数组中进行迭代,并将两个lat/lon值传递到查询中,以便每次执行 我该怎么做这样的事 我的查询和实现方式如下所示:X、Z值是将要传递的参数纬度/经度值,Y和T将通过执行我将处理的特定计算来获得。为清楚起见,我的查询返回多行和多列结果timestamp和count,因为它计算并返回属于小时间隔timestamp的请求数Postgresql 使用Pl/pgSQL向循环中的查询传递参数,postgresql,plpgsql,Postgresql,Plpgsql,我正在尝试创建一个参数化查询,该查询将使用plpgsql在循环中执行 这两个参数将是传递到查询中的起始纬度/经度点。纬度和经度点将从一个数组中检索,因此它将是一个类似于foreach的迭代,在数组中进行迭代,并将两个lat/lon值传递到查询中,以便每次执行 我该怎么做这样的事 我的查询和实现方式如下所示:X、Z值是将要传递的参数纬度/经度值,Y和T将通过执行我将处理的特定计算来获得。为清楚起见,我的查询返回多行和多列结果timestamp和count,因为它计算并返回属于小时间隔timesta
for each latitude-longitude pair X,Z in array
find Y and T from X and Z
WITH cal AS (
SELECT generate_series('2011-02-02 00:00:00'::timestamp ,
'2012-04-01 05:00:00'::timestamp ,
'1 hour'::interval) AS stamp
),
qqq AS (
SELECT date_trunc('hour', calltime) AS stamp, count(*) AS zcount
FROM mytable
WHERE calltime >= '2011-02-13 22:55:11'
AND calltime <= '2012-02-13 01:02:21'
AND (calltime::time >= '22:55:11'
OR calltime::time <= '01:02:21')
AND lat >= X
AND lat <= Y
AND lon >= Z
AND lon <= T
GROUP BY date_trunc('hour', calltime)
)
SELECT cal.stamp, COALESCE (qqq.zcount, 0) AS zcount
FROM cal
LEFT JOIN qqq ON cal.stamp = qqq.stamp
WHERE cal.stamp >= '2011-02-13 22:00:00'
AND cal.stamp <= '2012-02-13 01:02:21'
AND (
extract ('hour' from cal.stamp) >= extract ('hour' from '2011-02-13 22:00:00'::timestamp) or
extract ('hour' from cal.stamp) <= extract ('hour' from '2012-02-13 01:02:21'::timestamp)
)
ORDER BY stamp ASC;
将数组传递到函数中,对于SELECT*FROM UNNEST中的r,数组元素上的_数组循环,其中r是函数DECLARE子句中的记录变量;或
在传递给函数的refcursor上循环。看
更好的是,避免循环并将SELECT UNNESTHEARRAY集成到CTE中。PL/PgSQL中的循环比SQLCTE中的等效循环慢得多
我想我会和第二个一起走,因为我必须传递大约100万个不同的LAT/Lon值,结果将在C++端被处理,所以速度是至关重要的。非常感谢您提供的提示。@sm90901 Yikes,您当然不需要阵列了!Refcursors或临时表是处理此类数据量的方法。