基于 hstore 键的动态 INSERT 语句
Dynamic INSERT statement based on hstore keys
给定以下场景:
我有一个 table,其中基本上有 2 个相关列:
- table_name(文字)
- 数据(hstore)
hstore 键对应于 table_name 中引用的 table 的列。
我想根据这 2 列自动生成一个 INSERT 语句,将每个键的数据插入到引用 table 的列中。键当然可以变化,因为基本上任何 table 的数据都可以出现在 hstore 列中。
所有这些都发生在一个更大的函数中。 keys/colums 在一个数组中可用。
示例:
table_name = test_table
data = "id"=>"1", "trans"=>"4", "comment"=>"asdf"
结果语句:
INSERT INTO test_table (id, trans, comment) VALUES (1,4,'asdf');
目标是有一个函数,可以动态地将数据插入到右边 table,而不管 table_name 和数据中指定的是什么。
类似这样的方法可行:
CREATE OR REPLACE FUNCTION test.ins(table_name character varying, data jsonb)
RETURNS character varying AS
$BODY$
DECLARE
_keys character varying;
_vals character varying;
_comma character varying;
x RECORD;
BEGIN
_keys = '';
_vals = '';
_comma = '';
FOR x IN (SELECT * FROM jsonb_each(data))
LOOP
_keys = _keys || _comma || x.key;
_vals = _vals || _comma || x.value;
_comma = ', ';
END LOOP;
RETURN 'INSERT INTO ' || table_name || ' (' || _keys || ') VALUES (' || _vals || ')';
END
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;
给定以下场景: 我有一个 table,其中基本上有 2 个相关列:
- table_name(文字)
- 数据(hstore)
hstore 键对应于 table_name 中引用的 table 的列。 我想根据这 2 列自动生成一个 INSERT 语句,将每个键的数据插入到引用 table 的列中。键当然可以变化,因为基本上任何 table 的数据都可以出现在 hstore 列中。
所有这些都发生在一个更大的函数中。 keys/colums 在一个数组中可用。
示例:
table_name = test_table
data = "id"=>"1", "trans"=>"4", "comment"=>"asdf"
结果语句:
INSERT INTO test_table (id, trans, comment) VALUES (1,4,'asdf');
目标是有一个函数,可以动态地将数据插入到右边 table,而不管 table_name 和数据中指定的是什么。
类似这样的方法可行:
CREATE OR REPLACE FUNCTION test.ins(table_name character varying, data jsonb)
RETURNS character varying AS
$BODY$
DECLARE
_keys character varying;
_vals character varying;
_comma character varying;
x RECORD;
BEGIN
_keys = '';
_vals = '';
_comma = '';
FOR x IN (SELECT * FROM jsonb_each(data))
LOOP
_keys = _keys || _comma || x.key;
_vals = _vals || _comma || x.value;
_comma = ', ';
END LOOP;
RETURN 'INSERT INTO ' || table_name || ' (' || _keys || ') VALUES (' || _vals || ')';
END
$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100;