2011-10-13 51 views
2
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部分。動態省略限制條款

我知道這樣做的唯一方法是使查詢巨大的字符串,這將是醜陋的。

回答

2

你可以寫

LIMIT ALL 

得到所有行。此外,我引用manual

如果計數表達式的計算結果爲NULL,則將其視爲LIMIT ALL,即無限制。如果開始計算爲NULL,它是作爲OFFSET 0

人機工程學同等對待,簡單的寫:

LIMIT _limit 
OFFSET _offset 
+0

謝謝,我一直在尋找的8.1文檔。 – Keyo