我有一个返回列表的SELECT
语句:
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:我的最终目标是能够遍历此列表以创建一个动态将查询结果添加到物化视图的查询)
您需要定义函数以返回表。而且你真的不需要类型定义:
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;
以上假设列account
是text
类型。如果不是,那么您需要相应地调整RETURNS table(report_account text)
中的数据类型。
然后你可以像这样调用它:
SELECT *
FROM get_accounts('Report A');
不相关,但是:与列名相同的列别名实际上没有意义。 "account" as account"
和"account"
完全一样