我正在尝试获取一个可以放置在十个不同表之一中的客户ID。我不想对这些表名进行硬编码来找到它,所以我尝试了如下的postgresql函数。
create or replace FUNCTION test() RETURNS SETOF RECORD AS $$
DECLARE
rec record;
BEGIN
select id from schema.table_0201_0228 limit 1 into rec;
return next rec;
select id from schema.table_0301_0331 limit 1 into rec;
return next rec;
END $$ language plpgsql;
select * from test() as (id int)
由于我对Postgresql函数的用法不熟悉,如何改进代码以将'schema.table1'替换为变量,循环每个表并返回结果?
注意:表名可能会随着时间的变化而变化。例如,table_0201_0228和table_0301_0331分别用于2月和3月。
答案 0 :(得分:1)
为此您需要动态SQL:
create or replace FUNCTION test(p_schema text)
RETURNS table(id int)
AS $$
DECLARE
l_tab record;
l_sql text;
BEGIN
for l_tab in (select schemaname, tablename
from pg_tables
where schemaname = p_schema)
loop
l_sql := format('select id from %I.%I limit 1', l_tab.schemaname, l_tab.tablename);
return query execute l_sql;
end loop;
END $$
language plpgsql;
我将模式名称作为参数,但是您当然可以对其进行硬编码。由于该函数定义为returns table
,因此在使用时无需指定列名:
select *
from test('some_schema');