连接“表名+ ID”,然后使用该变量删除并在Postgresql中创建新的表名

时间:2019-01-15 02:43:23

标签: 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);

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

1 个答案:

答案 0 :(得分:0)

drop if exists %I

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

话虽如此,您的表a_save_tbl_AA可能是正常创建的,没有使用双引号。 带有%I的{​​{3}}函数将参数值视为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 $$;

请参见format,以了解引号如何工作。