【问题标题】:How to grab the value from JSON object in Postgresql and insert into some other tables?如何从 Postgresql 中的 JSON 对象中获取值并插入到其他一些表中?
【发布时间】:2020-10-05 09:25:28
【问题描述】:
{
  "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",
      "quantity": 225,
      "taskId": "task_ID_2"
    }
  ]
}

实现

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

-> 存储在变量中

->然后执行插入操作

不知怎的,它不起作用

所需的输出:

项目表

  • 项目编号

  • fullfillerId

  • 订单编号

  • sku代码

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

物品详情表

  • 项目编号

  • orderDetailsUrl

  • 任务标识

  • 数量

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

【问题讨论】:

    标签: sql postgresql postgresql-9.1 postgresql-9.5


    【解决方案1】:

    这是一个 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",
          "quantity": 225,
          "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->>'itemId' itemid, t->>'taskId' taskid, (t->>'quantity')::numeric quantity
         from json_array_elements(j -> 'items') t loop
            raise notice '% % % %', r.orderdetailsurl, r.itemid, r.taskid, r.quantity;
        end loop;
    end;
    $$;
    

    插入会更简单,没有循环:

    insert into target_table ( list - of - columns ) 
      select 
        j->>'orderDetailsUrl' orderdetailsurl, 
        t->>'itemId' itemid, 
        t->>'taskId' taskid, 
        (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;
    $$;
    

    【讨论】:

    • 这个功能完成后会不会只有2行? Stefanov.sm @Stefanov.sm
    • JSON 中的行数与 "items" 数组中的项目数一样多。我假设 JSON 是函数的参数,而不是插图块中的常量。
    • 所以我必须更新插入来代替提高通知??那么如果是这种情况,json 中的 2 个项目会有 4 个插入查询? @Stefanov.sm
    • 2 个目标表是项目表和项目详细信息表,如果您可以帮助如何在以 json 作为参数的函数调用中正确定位执行插入语句,这将很有帮助@Stefanov.sm @@Stefanov .sm
    • @AagamDoshi 我在答案中添加了一个函数定义。您可能需要在item insert 语句中添加字段和表达式。
    猜你喜欢
    • 2013-04-22
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多