2017-12-18 102 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(文本)'时运行,然后再次运行代码。非常感谢。 –

相关问题