如何使用变量作为表名?

时间:2015-03-09 21:58:23

标签: sql postgresql stored-procedures plpgsql dynamic-sql

BEGIN
   _table_name := 'mytable';

   CREATE TEMPORARY TABLE _table_name (
     id integer NOT NULL,
     name character varying,
     active boolean
   ) ON COMMIT DROP';

-- logic here

RETURN QUERY SELECT table1.id, table1.name FROM _table_name AS table1;
END;

我简化了我的问题。我正在尝试使用变量作为表名。

我知道您可以执行SELECT * FROM table1 WHERE id = _id之类的事情,其中​​_id已声明为可变。

我知道我可以这样做EXECUTE,但后来我有一个查询: INSERT INTO table2 (id) SELECT id FROM unnest(_ids) as id其中_ids是一个数组。

无论如何使用变量作为表名来解决问题1?问题2,在unnest内使用EXECUTE

所以问题是查询将_table_name作为文字表名,而不是使用'mytable'作为表名。

2 个答案:

答案 0 :(得分:2)

如果您动态更改表名(即通过变量),则需要使用EXECUTE。只要将数组转换为TEXT表示形式,就可以将它用于数组和不必要的数据。

DECLARE 
    _ids INT[] = ARRAY[ 1, 2, 3, 4, 5 ];
    _table_name TEXT = 'mytable';
BEGIN 
  EXECUTE
    'INSERT INTO ' || QUOTE_IDENT( _table_name ) || ' (id)
     SELECT id
     FROM unnest( ' || QUOTE_LITERAL( _ids::TEXT ) || '::INT[] ) AS id';
END; 

答案 1 :(得分:1)

你被告知dynamic SQL with EXECUTE in plpgsql。您可以动态构建查询字符串,包括不变的代码标识符

连接。请改用 USING 子句:

DECLARE 
   _ids INT[] = ARRAY[ 1, 2, 3, 4, 5 ];
   _table_name TEXT = 'mytable';
BEGIN 
   EXECUTE
    'INSERT INTO ' || quote_ident(_table_name) || ' (id)
     SELECT * FROM unnest($1)'
   USING ids;
END; 

来回避免容易出错的演员。

相关问题