plpgsql函数对于更复杂的东西没有任何问题。可能会影响性能的唯一情况是嵌套plpgsql函数时,因为查询计划程序无法在外部查询的上下文中进一步优化所包含的代码,这可能会使速度变慢,也可能不会使其变慢。 在此稍后的答案中有更多详细信息:
Postgresql函数中的语言sql和语言plpgsql之间的区别 在这种情况下,它比CASE查询中的许多子句简单得多:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
称呼:
SELECT * FROM get_stuff('hello', 'col2', 100);
笔记 用于RETURN QUERY EXECUTE
一次性返回查询结果。
使用quote_ident()
标识符反对sqlI保障。 或format()更复杂的事情。看:
表名作为Postgresql函数参数 将参数值与USING子句一起传递,以避免再次进行强制转换,引号和sqli。
注意不要在参数和列名之间创建命名冲突。_在示例中,我在参数名称前添加了下划线()。只是我个人的喜好。
编辑后的第二个函数无法工作,因为您只能parent在声明返回类型时返回SETOF stuff。您可以声明自己喜欢的任何返回类型,但是实际的返回值必须与声明匹配。您可能想要使用RETURNS TABLE它。