2017-12-18 103 views
0

我有一個SELECT語句返回一個列表:(PostgreSQL的)如何根據文本參數創建一個函數,並返回一個列表

SELECT "db"."accounts"."account" as account 
FROM db.accounts 
WHERE db.accounts.level = 'Level 4' AND db.accounts.report = 'Report A' 

截止報告可以是報告A或報告B,我想創建一個用戶選擇哪個報告的函數,如:get_account('Report A')。

我已經試過什麼:

CREATE TYPE get_accounts_results AS ARRAY[]; 

CREATE OR REPLACE FUNCTION get_accounts(report TEXT) RETURNS get_accounts_results AS 

    $$ 
     SELECT "db"."accounts"."account" as account 
     FROM db.accounts 
     WHERE db.accounts.level = 'Level 4' AND db.accounts.report = $1 
    $$ 

    LANGUAGE SQL; 

SELECT get_accounts('Report A') AS report_account; 

這讓我回只值1的時候,其實我需要n值 - 值的這個名單的數量是動態的。可能被創建的類型是錯誤的,但在這種情況下我沒有找到任何有意義的東西。

我的問題是:如何調整此查詢以獲得列表中創建的函數的結果?

(PS:我的最終目標是能夠通過此列表迭代進行查詢動態地將查詢結果的物化視圖)

回答

1

您需要定義你的函數返回一個表。而你並不真正需要的類型定義兩種:以上

CREATE OR REPLACE FUNCTION get_accounts(p_report TEXT) 
    RETURNS table(report_account text) 
AS 
$$ 
    SELECT act.account 
    FROM db.accounts as act 
    WHERE act.level = 'Level 4' 
    AND act.report = p_report; 
$$ 
LANGUAGE SQL; 

假定列accounttext類型。如果不是,則需要相應地調整RETURNS table(report_account text)中的數據類型。

然後,你可以這樣調用:

SELECT * 
FROM get_accounts('Report A'); 

無關,而是:一列別名是一樣的列名不真正意義。 "account" as account"是完全一樣的東西"account"

+0

謝謝您的回答,但我仍然得到結果只有一個,不知道爲什麼... –

+0

@CaioCarvalho:如果你定義和使用的功能,因爲我已經證明,只有解釋是隻有一行與表中的條件匹配 –

+0

不知道到底發生了什麼,但似乎Postgres並沒有取代該功能。它在我DROP FUNCTION get_account(文本)'時運行,然後再次運行代碼。非常感謝。 –

相關問題