Postgres как перебирать вложенный JSON объект - PullRequest
0 голосов
/ 26 мая 2020

У меня есть объект, как показано ниже. Я хотел бы перебрать каждого пользователя во вставке и вставить их в свою базу данных. Я застрял в том, как достичь внутренних объектов. У меня есть код, подобный приведенному ниже, и я застрял в том, как продолжить go в объекте, он получает только insert, delete и update. Я использую для этого postgresql.

Я вижу ->> int Get JSON array element as text '[1,2,3]'::json->>2 в документации, но не знаю, как включить его в свой код

DECLARE
   _key   text;
   _value text;
BEGIN
    FOR _key, _value IN
       SELECT * FROM jsonb_each_text($1)
    LOOP
       RAISE NOTICE '%: %', _key, _value;
    END LOOP;

    RETURN input;
END




 {
      insert: {
        jsmith:
        { 
          name: 'John Smith',
          mail: 'JSmith@smith.com',
          jobTitle: 'Lead',
          hasImage: true,
          teamId: '35' 
        },
        lmark:
        {
          name: 'Laurendy Mark',
          mail: 'LMark@mark.com',
          jobTitle: 'System Admin',
          hasImage: true,
          teamId: '40'
        }
      },
      delete: {
        lbeth
        {
          name: 'Lisa Beth',
          mail: 'LBeth@smith.com',
          jobTitle: 'Assistant Director',
          hasImage: true,
          teamId: '40',
          uid: '200'
        }
      },
      update: {}
    }

1 Ответ

0 голосов
/ 26 мая 2020

Для этого вам не нужна функция PL / pg SQL. Это можно сделать с помощью данных, изменяющих CTE

with input (col) as (
  values ('
    {
       "insert":{ 
        "jsmith":{"name":"John Smith", "mail":"JSmith@smith.com","jobTitle":"Lead","hasImage":true,"teamId":35},
        "lmark":{"name":"Laurendy Mark","mail":"LMark@mark.com","jobTitle":"System Admin","hasImage":true,"teamId":40}
       },
       "delete":{
         "lbeth":{"name":"Lisa Beth","mail":"LBeth@smith.com","jobTitle":"Assistant Director","hasImage":true,"teamId":40,"uid":200}
       },
       "update":{}
    }'::jsonb)
), do_insert as (
  insert into the_table (name, mail, job_title, has_image, team_id)
  select i.value ->> 'name', 
         i.value ->> 'mail',
         i.value ->> 'jobTitle',
         (i.value ->> 'hasImage')::boolean,
         (i.value ->> 'teamId')::int
  from input
   cross join jsonb_each(col -> 'insert') i
  returning *
), do_delete as (
  delete from the_table
  where uid in (select (i.value ->> 'uid')::int
                 from input
                   cross join jsonb_each(col -> 'delete') i)
)                   
update the_table
  set has_image = (i.value ->> 'hasImage')::boolean
from input
 cross join jsonb_each(col -> 'update') i
where (i.value ->> 'uid')::int = the_table.uid
;

Онлайн-пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...