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

I want fetch data from different different table name using postgresql function

我有 30 个州级数据 tables。 Table 名称如 aa_shg_detail、ab_shg_detail、ac_shg_detail。

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

在第一个函数中,我传递了状态代码,因此它获取状态短名称和短名称与 _shg_detail 字符串连接并准备完整的 table 名称和 return 它。示例:如果我传递状态代码 2,查询基于状态代码 2 从状态的主要 table 获取状态短名称。状态代码 2 的状态短名称为 'ab',因此在连接状态短名称与 _shg_detail 第一个函数 return ab_shg_detail table 名称之后。

第二个函数从第一个函数获取 table 名称并从该 table 获取数据。但是我在第二个函数中遇到错误。

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)

为此你需要 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 占位符可以在需要时正确处理标识符的引用。