PostgreSQL 中的动态限制

man*_*vda 7 postgresql

我有函数返回员工列表,我的要求是,如果我将 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)

他们有什么办法可以在功能上做这样的逻辑吗?

Pat*_*ick 5

是的,您可以为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会产生不可预测的结果。