如何在postgresql SQL函数中使用参数作为表名

时间:2016-07-05 10:00:26

标签: sql postgresql function

我有一个函数来返回一个匹配给定值的数组的相关位置,如下所示:

CREATE OR REPLACE FUNCTION get_index(needle ANYELEMENT, haystack ANYARRAY)
  RETURNS TABLE (i_position int)
  AS $$

    SELECT 
           i+i_step AS i_position
    FROM   (VALUES(1),(2)) steps(i_step),
                          generate_series(array_lower($2,1), array_upper($2,1)) AS i
    WHERE $2[i] = $1 

$$ LANGUAGE SQL STABLE;

我想传递一个表名,而不是将单个值传递给函数,因为表的一列将用于进行值比较(WHERE $ 2 [i] = $ 1),而不是单个值传递给函数。但是,似乎函数不支持使用参数作为表名的SQL。

我想知道是否有其他选择。为了提高性能,我想使用SQL函数而不是PLPGSQL。因为我们的桌子很大。

我想实现以下目标:

CREATE OR REPLACE FUNCTION get_index(tbl ANYELEMENT, haystack ANYARRAY)
  RETURNS TABLE (i_position int)
  AS $$

    SELECT 
           i+i_step AS i_position
    FROM   (VALUES(1),(2)) steps(i_step),
                          generate_series(array_lower($2,1), array_upper($2,1)) AS i,
                          $1
    WHERE $2[i] = $1.col1 

$$ LANGUAGE SQL STABLE;

1 个答案:

答案 0 :(得分:0)

在SQL函数中是不可能的 - 它不支持动态sql 。你必须使用PLpgSQL - EXECUTE语句。

仅当内联成功时,SQL函数才比PLpgSQL快。如果不成功,并且应该评估SQL函数,那么PLpgSQL应该不会慢。当SQL函数体包含像generate_series这样的SRF函数时,内联无效。