如何从Postgresql中的JSON对象中获取值并插入到其他表中?

问题描述

{
  "orderId": "s","fulfillerId": "qaqj8fkbmb","orderDetailsUrl": "asd","items": [
    {
      "dTe": "laseIn","itemDescription": "Tetesting","itemId": "item_1","manufacturingUrl": "https://uploads_1.documents.press","skuCode": "1223","productName": "Tesing","quantity": 225,"taskId": "task_ID_1"
    },{
      "dTe": "laseIn","itemDescription": "Test Sku for Oracle testing","itemId": "item_2","manufacturingUrl": "https://uploads_2.documents.press","skuCode": "123","productName": "Test Sku for Oracle testing","taskId": "task_ID_2"
    }
  ]
}

实现

->获取orderId / fulfillerId / orderDetailsUrl的值,并对项目数组对象执行迭代,以获取所需值作为其相似对象的数组

->存储在变量中

->然后执行插入操作

不知何故

所需的输出:

项目表

  • itemId

  • fullfillerId

  • orderId

  • skuCode

++项目表中JSON中的所有剩余数据

ItemDetails表

  • itemId

  • orderDetailsUrl

  • taskId

  • 数量

我尝试了各种jsonb格式,但是解析后无法获得准确的输出,我无法从JSON中选择值并使用插入查询

解决方法

这是一个plpgsql块,用于说明如何执行。 raise notice将被相关命令替换,例如insert

do language plpgsql
$$
declare 
j constant json default $json$
{
  "orderId": "s","fulfillerId": "qaqj8fkbmb","orderDetailsUrl": "asd","items": [
    {
      "dTe": "laseIn","itemDescription": "Tetesting","itemId": "item_1","manufacturingUrl": "https://uploads_1.documents.press","skuCode": "1223","productName": "Tesing","quantity": 225,"taskId": "task_ID_1"
    },{
      "dTe": "laseIn","itemDescription": "Test Sku for Oracle testing","itemId": "item_2","manufacturingUrl": "https://uploads_2.documents.press","skuCode": "123","productName": "Test Sku for Oracle testing","taskId": "task_ID_2"
    }
  ]
}
$json$;
r record;
begin
    -- Item
    for r in select j->>'fulfillerId' fullfillerid,j->>'orderId' orderid,t->>'itemId' itemid,t->>'skuCode' skucode
     from json_array_elements(j -> 'items') t loop
        raise notice '% % % %',r.fullfillerid,r.orderid,r.itemid,r.skucode;
    end loop;
    --ItemDetails
    for r in select j->>'orderDetailsUrl' orderdetailsurl,t->>'taskId' taskid,(t->>'quantity')::numeric quantity
     from json_array_elements(j -> 'items') t loop
        raise notice '% % % %',r.orderdetailsurl,r.taskid,r.quantity;
    end loop;
end;
$$;

插入将变得更简单,而无需循环:

insert into target_table ( list - of - columns ) 
  select 
    j->>'orderDetailsUrl' orderdetailsurl,(t->>'quantity')::numeric quantity
    -- other expressions maybe
  from json_array_elements(j -> 'items') t;

作为插入item表和itemietails表中的函数:

create or replace function json_items(raw_data json)
returns void language plpgsql as
$$
begin
 insert into itemdetails(itemid,orderdetailsurl,taskid,quantity) 
  select 
    t->>'itemId',raw_data->>'orderDetailsUrl',t->>'taskId',(t->>'quantity')::numeric
  from json_array_elements(raw_data  -> 'items') t;

 insert into item(itemid,fullfillerid,orderid,skucode,dte,itemdescription)
  select 
    t->>'itemId',raw_data->>'fullfillerId',raw_data->>'orderId',t->>'skuCode',t->>'dte',t->>'itemDescription'
  from json_array_elements(raw_data  -> 'items') t;
end;
$$;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...