基于hstore键的动态INSERT语句

时间:2016-08-25 06:55:16

标签: sql postgresql plpgsql hstore

给出以下场景: 我有一张桌子,其中基本上有两个相关的栏目:

  • table_name(text)
  • 数据(hstore)

hstore键对应于table_name中引用的表的列。 我想基于这两列自动生成一个INSERT语句,它将每个键的数据插入到该引用表的列中。当然,密钥可能会有所不同,因为基本上任何表的数据都可以出现在hstore列中。

所有这些都发生在更大的功能中。键/列以阵列形式提供。

示例:

table_name = test_table
data = "id"=>"1", "trans"=>"4", "comment"=>"asdf"

结果声明:

INSERT INTO test_table (id, trans, comment) VALUES (1,4,'asdf');

目标是拥有一个动态将数据插入到右表中的函数,无论table_name和data中指定了什么。

1 个答案:

答案 0 :(得分:1)

这样的事情可行:

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;