PostgreSQL插入到从JSON选择

时间:2019-12-01 13:13:28

标签: postgresql postgresql-12

是否可以在不指定列的情况下从JSON中的json字典插入表中?

鉴于有一个books_1表:

CREATE TABLE books_1 ( data json );
INSERT INTO books VALUES ('{ "name": "Book the First", "author": "Bob White" }');
INSERT INTO books VALUES ('{ "name": "Book the Second", "author": "Charles Xavier" }');
INSERT INTO books VALUES ('{ "name": "Book the Third", "author": "Jim Brown" }');

我要插入具有完全相同的列和数据类型的表中,例如:

CREATE TABLE books_2 ( name varchar(100), author varchar(100) );

理想情况下,我会执行:

INSERT INTO books_2
SELECT something_json(data) FROM books_1

背景: 使用标准PostgreSQL,我可以轻松进行JSON表转储。我也可以导入它们,但它们将作为jsonb导入。

COPY ( SELECT ROW_TO_JSON(t) FROM (SELECT * FROM books_2) t) TO 'C:\Users\Public\books.json';

CREATE TABLE books_1 ( j jsonb );
COPY t FROM 'C:\Users\Public\books.json';

我想将json重新导入“常规”属性,而不是json。我可以通过指定所有列来做到这一点,但是由于有很多表和列,我真的不想这样做。既然列都是一样的,那就没有必要了。

我可能正在寻找一个根据json中的键返回列列表的函数。我想顺序必须相同。但是由于导出也是从PostgreSQL完成的,因此可以保证。

1 个答案:

答案 0 :(得分:1)

您可以将json_populate_record与目标表的行类型一起使用:

INSERT INTO books_2
SELECT rec.* FROM books_1, json_populate_record(null::books_2, books_1.data) rec;

online demo