我有函数返回员工列表,我的要求是,如果我将 Limit 传递给函数,那么我应该得到带有限制和偏移量的结果,如果我不通过限制,则应返回所有行
例如
When Limit is greater than 0(I am passing Limit as 10)
Select * from Employees
Limit 10 offset 0
When Limit is equal to 0 than
Select * from Employees
Run Code Online (Sandbox Code Playgroud)
他们有什么办法可以在功能上做这样的逻辑吗?
是的,您可以为LIMITandOFFSET子句传递表达式,其中包括使用传递给函数的参数。
CREATE FUNCTION employees_limited(limit integer) RETURNS SET OF employees AS $$
BEGIN
IF limit = 0 THEN
RETURN QUERY SELECT * FROM employees;
ELSE
RETURN QUERY SELECT * FROM employees LIMIT (limit)
END IF;
RETURN;
END; $$ LANGUAGE plpgsql STRICT;
Run Code Online (Sandbox Code Playgroud)
注意LIMIT子句周围的括号。您可以类似地传入一个OFFSET值。
不过,这个例子非常简单。您可以通过执行LIMIT函数的外部来实现相同的效果:
SELECT * FROM my_function() LIMIT 10;
Run Code Online (Sandbox Code Playgroud)
在函数内部执行此操作实际上仅对复杂查询有用,可能涉及大量数据。
另请注意,LIMIT没有a 的子句ORDER BY会产生不可预测的结果。