postgres

时间:2017-10-03 06:03:54

标签: sql postgresql

我正在尝试将select语句与在循环中动态计算的数组相交,然后测量每个相交查询所花费的时间。

所以在循环的第一次迭代中,我希望查询是这样的:

'select sub_id from table where main_id=1 INTERSECT select array[''80'']';

在第二次迭代中:

'select sub_id from table where main_id=1 INTERSECT select array[''80'', ''81'']';

等等,并测量每次迭代执行查询所花费的时间。

当我运行此脚本时,我收到错误:

  

背景:分配时的PL / pgSQL函数inline_code_block

对应于我初始化query1的行。如何更正query1的赋值?我正在使用PostgreSQL 9.1。

arr := '{}';
for j in 80..120 loop
  arr := array_append(arr, j::text);
  query1 := 'select sub_id from table where main_id=1 INTERSECT' || ' select unnest(arr)';
  execute 'explain (analyse, format json) ' || query1 into p;
  t := (p->0->>'Planning Time')::float + (p->0->>'Execution Time')::float;
  total_time := total_time + t;
end loop;

1 个答案:

答案 0 :(得分:3)

execute的查询文本无法引用调用范围中的变量。您必须将变量作为参数传递给using,如:

query1 := 'select sub_id from YourTable where main_id=1 INTERSECT select unnest($1)';
execute 'explain (analyse, format json) ' || query1 using arr into p;
                                                    ^^^^^^^^^

Working example at rextester.com