CREATE OR REPLACE FUNCTION somefunction(ret refcursor, _id oid, _offset integer, _limit integer) RETURNS refcursor
LANGUAGE plpgsql
AS $_$
BEGIN
OPEN $1 FOR
--My actual select is much more complicated that this.
SELECT a FROM b
WHERE id = _id
ORDER BY otu.id desc
--does not work: invalid input syntax for integer: "ALL"
LIMIT (CASE WHEN _limit IS NULL THEN 'ALL' ELSE _limit END)
--CASE WHEN _limit IS NOT NULL THEN LIMIT _limit END
OFFSET (CASE WHEN _offset IS NULL THEN '0' ELSE _offset END);
RETURN $1;
END
$_$;
我希望_offset和_limit可以为空,因此可以返回所有结果。如果_limit为NULL,如何动态省略此查询的LIMIT部分。
我知道这样做的唯一方法是使查询成为巨大的字符串,这将是丑陋的。
答案 0 :(得分:2)
你可以写
LIMIT ALL
获取所有行。另外,我引用manual:
如果计数表达式的计算结果为NULL,则将其视为LIMIT ALL,即无限制。如果start计算为NULL,则将其视为OFFSET 0
Ergo,只需写下:
LIMIT _limit
OFFSET _offset