JSONをSQLステートメントにフィードして、情報を抽出し、それをテーブルに挿入できます。 JSON属性の名前がテーブルの列とまったく同じである場合は、次のように実行できます。
with customer_json (doc) as (
values
('[
{
"id": 23635,
"name": "Jerry Green",
"comment": "Imported from facebook."
},
{
"id": 23636,
"name": "John Wayne",
"comment": "Imported from facebook."
}
]'::json)
)
insert into customer (id, name, comment)
select p.*
from customer_json l
cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update
set name = excluded.name,
comment = excluded.comment;
新規のお客様が挿入され、既存のお客様が更新されます。 「魔法」の部分はjson_populate_recordset(null::customer, doc)
です。 JSONオブジェクトのリレーショナル表現を生成します。
上記は、次のようなテーブル定義を前提としています。
create table customer
(
id integer primary key,
name text not null,
comment text
);
データがファイルとして提供されている場合は、最初にそのファイルをデータベースのテーブルに配置する必要があります。このようなもの:
create unlogged table customer_import (doc json);
次に、ファイルをそのテーブルの1つの行にアップロードします。 \copy
を使用する psql
のコマンド (またはSQLクライアントが提供するものは何でも):
\copy customer_import from 'customers.json' ....
次に、上記のステートメントを使用して、CTEを削除し、ステージングテーブルを使用できます。
insert into customer (id, name, comment)
select p.*
from customer_import l
cross join lateral json_populate_recordset(null::customer, doc) as p
on conflict (id) do update
set name = excluded.name,
comment = excluded.comment;