连接"表名 + id",然后使用该变量在 Postgresql 中删除并创建一个新的表名



我正在创建分区表,因此我需要使用可能包含一行或多行成本中心数据的输入表为每个成本中心创建一个表。 输入表有一个名为 'cost_center' 的列。 我正在使用Postgresql 9.5。

为了连接表名,我编写了以下内容:

select cost_cent, 
concat('a_save_tbl_', cost_center) hold_tbl_name from a_input_tbl 
limit 1;

此命令返回正确的表名'a_save_tbl_AA'。 然后我尝试了以下变体:

query1 := format('drop if exists %I, hold_tbl_name);

没有成功。 我找不到正确的代码来删除、创建和填充新表。 我阅读了很多帖子和文档,但是,所有内容都返回语法错误。 我将不胜感激。

drop if exists %I

在语法上是错误的。应该是drop table if exists %I

话虽如此,您的表a_save_tbl_AA很可能是在不使用双引号的情况下正常创建的。带有 %I 的格式函数将参数值视为 SQL 标识符,并在必要时对其进行双引号。

所以,如果你的cost_center是大写('AA'),最好转换并传递小写来代替%I。下面的代码有效,可能对您的实际要求有用。

DO $$
 DECLARE 
  l_hold_tbl_name TEXT;
  query1 text ;
  query2 text ;
 BEGIN 
  SELECT Concat('a_save_tbl_', cost_center) 
  INTO   l_hold_tbl_name 
  FROM   a_input_tbl limit 1; 
  query1 := format('drop table if exists %I', lower(l_hold_tbl_name)); 
  query2 := format('create table  %I as select 2 as id',lower(l_hold_tbl_name)); 
  EXECUTE query1; 
  EXECUTE query2; 
END $$;

请参阅演示以了解引号的工作原理。

最新更新