如何使用变量作为 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。您动态构建查询字符串,包括不变的 code 和 identifiers.
但是不要连接值。请改用 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
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。您动态构建查询字符串,包括不变的 code 和 identifiers.
但是不要连接值。请改用 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