使用json_populate_recordset从单个JSON对象填充多个表

Pic*_*icl 3 sql postgresql import json common-table-expression

我已经阅读了相关的问题,但与用户kenthewala不同,我想将JSON对象数组放入数据库中。

我的JSON文件如下所示:

{
"tablename_a":[{"a_id":1,"b_id":2,"c_id":3},
 {"a_id":2,"b_id":51,"c_id":3}],
"tablename_b":[{"b_id":2,"name":"John Doe", "z_id":123},
 {"b_id":51,"name":"Mary Ann", "z_id":412}],
"tablename_c":[{"c_id":3, "OS type":"Windows 7"}],
"tablename_z":[{"z_id":123, "Whatever":"Something"},
{"z_id":123, "Whatever":"Something else"}]
}
Run Code Online (Sandbox Code Playgroud)

具有相应名称的表已存在于数据库中。

在伪代码中,我想到了类似的东西

for each key in JSON_FILE as tbl_name
(
  insert into tbl_name select * from json_populate_recordset
  (
    null::tbl_name, 'content of tbl_name'
  )
)
Run Code Online (Sandbox Code Playgroud)

但是我不确定如何实现这一点。

我正在使用PostgreSQL 9.3.5(如果有帮助,则使用PHP 5.3.3)。

该表结构类似于JSON文件(正如我最初从db导出JSON一样):

create table tablename_a (a_id integer, b_id integer, c_id integer);
create table tablename_b (b_id integer, name text, z_id integer);
Run Code Online (Sandbox Code Playgroud)

等等。

Erw*_*ter 5

3个步骤:

  1. JSON对象wich的访问字段->
  2. 使用创建从记录的JSON数组派生的表json_populate_recordset()
  3. 分解INSERT命令的行类型。

要为所有表重用输入值,请将其包装在修改数据的CTE中

WITH input AS (
   SELECT '{
      "tablename_a":[{"a_id":1,"b_id":2,"c_id":3},
       {"a_id":2,"b_id":51,"c_id":3}],
      "tablename_b":[{"b_id":2,"name":"John Doe", "z_id":123},
       {"b_id":51,"name":"Mary Ann", "z_id":412}],
      "tablename_c":[{"c_id":3, "OS type":"Windows 7"}],
      "tablename_z":[{"z_id":123, "Whatever":"Something"},
      {"z_id":123, "Whatever":"Something else"}]
      }'::json AS j
   )
,  a AS (
   INSERT INTO tablename_a
   SELECT t.*
   FROM   input i
        , json_populate_recordset(NULL::tablename_a, i.j->'tablename_a') t
   )
,  b AS (
   INSERT INTO tablename_b
   SELECT t.*
   FROM   input i
        , json_populate_recordset(NULL::tablename_b, i.j->'tablename_b') t
   )
   -- ... more ...
INSERT INTO tablename_z
SELECT t.*
FROM   input i
     , json_populate_recordset(NULL::tablename_z, i.j->'tablename_z') t
;
Run Code Online (Sandbox Code Playgroud)

SQL提琴。

使用隐式JOIN LATERAL。有关: