2015-06-25 45 views
1

我有這樣的功能:PL/pgSQL的:添加靜態列查詢結果

CREATE OR REPLACE FUNCTION func2(a integer[]) 
    RETURNS SETOF newset AS 

$BODY$ 
declare 
    x int; 
begin 

    FOREACH x IN ARRAY $1 
    LOOP 
    RETURN QUERY SELECT * FROM func1(x); 
    END LOOP; 

return; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

func2簡單地從到func1所有呼叫追加所有行。如果第一次調用func1給出2行,第二次調用給出3行,則func2將總共返回5行(行本身)。

func1返回3列的模式,所以當前func2返回相同的模式。

我想更改func2,所以它會返回4列。來自func1的3個和包含值x的另一列。

例如: 主叫func2(ARRAY[500,200]) 和假設func1(500)返回2行和func1(200)返回3行。 我將獲得:

first second third forth 
a   b  c  500 
d   e  f  500 
g   h  i  200 
j   k  l  200 
m   n  o  200  

我創建了一個newset2newset爲int的另一列FUNC2

CREATE OR REPLACE FUNCTION func2(a integer[]) 
    RETURNS SETOF newset2 AS 

如何所需的列添加到函數?

回答

2

你可以只返回額外的列:

RETURN QUERY SELECT *, x FROM func1(x); 
+0

謝謝!簡單明瞭 – John

+0

我可以用'x'命令嗎?如果我添加'排序'它不起作用。它命令調用'func1'而不是整個行。 – John

+0

你的'func2'返回多次。爲了有效排序,你可以將'func1'中的各種行集插入一個臨時表中並返回。 – Andomar

0

這可以大致更高效使用unnest()一個LATERAL加入純SELECT查詢。應用任何排序順序也更簡單。

SELECT f.*, x 
FROM unnest(ARRAY[500,200]) x, func1(x) f -- implicit LATERAL join 
ORDER BY x; 

就是這樣,包括額外請求的排序順序。
這是你的SELECT * FROM func2(ARRAY[500,200])的直接替換品,不需要func2()

可以當然還是把它包裝成一個函數。我建議一個簡單的SQL函數:

CREATE OR REPLACE FUNCTION func2(a integer[]) 
    RETURNS SETOF newset AS 
$func$ 
SELECT f.*, x 
FROM unnest(ARRAY[500,200]) x, func1(x) f 
ORDER BY x; 
$func$ LANGUAGE sql 

行類型newset有以某種方式預先定義。

相關: