PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

zaktualizować wiele wierszy w jednym zapytaniu, ale dane wejściowe, których oczekujemy, pochodzą z obiektu json z wieloma danymi

Możesz zrobić wstawianie zbiorcze na podstawie dokumentu json. Powinieneś ponownie sformatować dokument, ponieważ format pokazany w pytaniu jest dziwny i niepraktyczny.

Pełny przykład pracy:

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;

Wynik:

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)    

Jeśli chcesz zaktualizować tabelę (zamiast wstawiać do niej):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Narzędzie do wysyłania zapytań pgadmin4 zawsze wraca bez połączenia

  2. Sparametryzowana PostgreSQL funkcja Order By / Limit w tabeli

  3. Psycopg2 copy_from rzuca DataError:nieprawidłowa składnia wejściowa dla liczby całkowitej

  4. Synchronizuj elasticsearch przy połączeniu z bazą danych - nodeJS

  5. Sekwencja nie resetuje się po obcięciu tabeli