我有一个函数来返回一个匹配给定值的数组的相关位置,如下所示:
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;
答案 0 :(得分:0)
在SQL函数中是不可能的 - 它不支持动态sql 。你必须使用PLpgSQL - EXECUTE
语句。
仅当内联成功时,SQL函数才比PLpgSQL快。如果不成功,并且应该评估SQL函数,那么PLpgSQL应该不会慢。当SQL函数体包含像generate_series
这样的SRF函数时,内联无效。