我想使用postgresql函数从不同的不同表名称中获取数据

时间:2019-08-27 09:02:36

标签: postgresql postgresql-10

我有30个状态明智的数据表。表格名称,例如aa_shg_detail,ab_shg_detail,ac_shg_detail。

我还有一个主状态表,其中存储了状态简称和状态代码。我创建了2个postgresql函数getTableName(Code text)和getDataByTable()。

在第一个函数中,我传递状态代码,以便它使用_shg_detail String提取状态简称和简称concat,并准备完整的表名并返回它。示例:如果我传递状态代码2,则查询将从状态主表中基于状态代码2获取状态简称。状态代码2的状态简称为'ab',因此在使用_shg_detail的第一个函数concat状态简称后,返回ab_shg_detail表名。

第二个函数从第一个函数获取表名,并从该表中获取数据。但是我在第二个功能中遇到了错误。

CREATE OR REPLACE FUNCTION getTableName(code text) 
  RETURNS text 
AS $$ 
   select concat(lower(state_short_name), '_shg_detail') from main_state where state_code = code)) 
$$  
LANGUAGE sql; 

CREATE OR REPLACE FUNCTION getDataByTable() 
  RETURNS text AS $$ 
DECLARE 
    tablename text; 
BEGIN 
   tablename := gettablename('2');
   RETURN (select shg_code from tablename);  
END;
$$  LANGUAGE plpgsql; 

当我执行第二个功能select getDataByTable()时,每次都会出现此错误:

ERROR:  relation "tablename" does not exist
LINE 1: SELECT (select shg_code from tableName)

1 个答案:

答案 0 :(得分:1)

您需要dynamic SQL

CREATE OR REPLACE FUNCTION getDataByTable() 
  RETURNS text AS $$ 
DECLARE 
    tablename text;
    l_result text; 
BEGIN 
   tablename := gettablename('2');
   execute format('select shg_code from %I', tablename)  
     into l_result;
   RETURN l_result;  
END;
$$  LANGUAGE plpgsql; 

format()函数的%I占位符可以根据需要正确处理标识符的引用。

相关问题