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

1つのクエリで複数の行を更新しますが、期待する入力は複数のデータのjsonオブジェクトからのものです

    jsonドキュメントに基づいて一括挿入を行うことができます。質問に示されている形式は奇妙で実用的ではないため、ドキュメントを再形式化する必要があります。

    完全な実例:

    create table example(id int primary key, email text, last_name text, first_name text);
    
    with jsondata(jdata) as (
        values
        (
        '[
            {"id": 1, "email": "[[email protected]]", "first_name": "John", "last_name": "Doe"},
            {"id": 2, "email": "[[email protected]]", "first_name": "Robert", "last_name": "Duncan"},
            {"id": 3, "email": "[[email protected]]", "first_name": "Ram", "last_name": "Das"},
            {"id": 4, "email": "[[email protected]]", "first_name": "Albert", "last_name": "Pinto"},
            {"id": 5, "email": "[[email protected]]", "first_name": "Robert", "last_name": "Peter"},
            {"id": 6, "email": "[[email protected]]", "first_name": "Christian", "last_name": "Lint"},
            {"id": 7, "email": "[[email protected]]", "first_name": "Mike", "last_name": "Hussey"},
            {"id": 8, "email": "[[email protected]]", "first_name": "Ralph", "last_name": "Hunter"}
        ]'::jsonb)
    )
    
    insert into example 
    select (elem->>'id')::int, elem->>'email', elem->>'last_name', elem->>'first_name'
    from jsondata,
    jsonb_array_elements(jdata) as elem;
    

    結果:

    select *
    from example
    
     id |     email     | last_name | first_name 
    ----+---------------+-----------+------------
      1 | [[email protected]] | Doe       | John
      2 | [[email protected]] | Duncan    | Robert
      3 | [[email protected]] | Das       | Ram
      4 | [[email protected]] | Pinto     | Albert
      5 | [[email protected]] | Peter     | Robert
      6 | [[email protected]] | Lint      | Christian
      7 | [[email protected]] | Hussey    | Mike
      8 | [[email protected]] | Hunter    | Ralph
    (8 rows)    
    

    (テーブルに挿入する代わりに)テーブルを更新する場合:

    with jsondata(jdata) as (
        -- values as above
    )
    
    update example set
        email = elem->>'email', 
        last_name = elem->>'last_name', 
        first_name = elem->>'first_name'
    from jsondata,
    jsonb_array_elements(jdata) as elem
    where id = (elem->>'id')::int;
    


    1. 最大値に基づいてテーブルを結合する

    2. 'SQLSTATE [HY093]:無効なパラメーター番号:バインドされた変数の数がトークンの数と一致しません'

    3. SQLServerでの正規表現の使用

    4. Oracleでテーブルv$parameterが見つかりません