如何使用变量作为 table 名称?

How to use variable as table name?

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;

我已经简化了我的问题。我正在尝试使用变量作为 table 名称。

我知道你可以做类似 SELECT * FROM table1 WHERE id = _id 的事情,其中​​ _id 是声明的变量。

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

如何使用变量作为 table 名称来解决问题 1?和问题 2,在 EXECUTE?

中使用 unnest

所以问题是查询将 _table_name 作为文字 table 名称,它看起来不像是使用 'mytable' 作为 table 名称.

如果您要动态更改 table 名称(即通过变量),那么您将需要使用 EXECUTE。只要将数组 to/from 转换为 TEXT 表示,就可以将其与数组和 unnest 一起使用。

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; 

有人告诉您 dynamic SQL with EXECUTE in plpgsql。您动态构建查询字符串,包括不变的 codeidentifiers.

但是不要连接。请改用 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()'
   USING ids;
END; 

避免容易出错的来回转换。

  • Table name as a PostgreSQL function parameter