2015-09-15 73 views
0

我有函數返回Employees列表,我的要求是如果我通過Limit函數比我應該得到的結果與限制和抵消,如果我不通過限制比所有行應返回PostgreSQL中的動態限制

例如

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 

是他們的任何方式在功能上做了這樣的邏輯?

回答

1

是的,您可以傳遞LIMITOFFSET子句的表達式,其中包括使用傳遞給函數的參數。

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; 

請注意圍繞LIMIT子句的括號。您同樣可以傳遞OFFSET值。

雖然這個例子是非常微不足道的。你可以通過執行LIMIT外的函數的實現同樣的效果:

SELECT * FROM my_function() LIMIT 10; 

這樣做在函數中真的只能是一個複雜的查詢有用的,可能涉及大量的數據。

另請注意,沒有ORDER BYLIMIT子句會產生不可預知的結果。

+0

謝謝你的回答,你的解決方案運行良好,當我們有簡單的查詢,假設我的查詢有150行比我不能實現上述解決方案,因爲我的功能將變得非常大(行數)不必要的。 –

0

請注意,帶有LIMIT的SELECT應始終包含一個ORDER BY,因爲如果未明確指定,返回行的順序可能是未定義的。

LIMIT的歐洲工商管理學院,你可以在下面的查詢使用ROW_NUMBER(),如:

SELECT * 
FROM (
    SELECT *, row_number() OVER (ORDER BY id) AS rn 
    FROM Employees 
) AS s 
WHERE 
    (rn>:offset AND rn<=:limit+:offset) OR :limit=0 
0

對不起,我不能發表評論。解決方案几乎由Patrick提供。
首先我們應該寫功能返回結果沒有限制。

CREATE FUNCTION test() 
RETURNS TABLE (val1 varchar, val2 integer) AS $$ 
    BEGIN 
    SELECT val1, val2 FROM test_table; 
    END; 
$$ LANGUAGE plpgsql; 

然後我們必須編寫包裝函數,它將處理限制。

CREATE FUNCTION test_wrapper (l integer DEFAULT 0) 
RETURNS TABLE (name varchar, id integer) AS $$ 
    BEGIN 
     IF l = 0 THEN 
      RETURN QUERY SELECT * FROM test(); -- returns everything 
     ELSE 
      RETURN QUERY SELECT * FROM test() LIMIT (l); -- returns accordingly 
     END IF; 
    END; 
$$ LANGUAGE plpgsql; 

在我的情況下,我需要返回表作爲最終結果,但可以從包裝函數返回任何所需的東西。