我正在创建分区表,因此我需要使用一个可能包含一行或多行成本中心数据的输入表,为每个成本中心创建一个表。输入表具有名为'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);
没有成功。我找不到正确的代码来删除,创建和填充新表。我读了很多文章和文档,但是所有内容都返回语法错误。我将不胜感激。
答案 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,以了解引号如何工作。