sql >> データベース >  >> RDS >> PostgreSQL

JSONファイルをPostgreSQLにインポートするにはどうすればよいですか?

    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;
    


    1. SQL ServerでのNULLIF()のしくみ

    2. パブリックネットワーク上でサイバー攻撃からMySQLとMariaDBデータベースを保護する方法

    3. MySQLダンプでこれらのコメントを取り除くにはどうすればよいですか?

    4. IN条件がSQLの=より遅いのはなぜですか?