Postgresql:处理Postgresql中的Jsonb数据的最佳方法的最佳方法

时间:2020-10-20 13:22:23

标签: sql postgresql

如果我收到唯一的Key约束(在本例中为item_id),则尝试在下面的SP中处理插入/插入请求以及插入(如果收到新的主值)

主键:ItemId

  1. 如果没有唯一键约束插入视图
  2. 如果发生唯一键约束,即具有相同itemId的json,则将其属性(即属性)更新。数量,状态等

存储过程

CREATE OR REPLACE FUNCTION sp_post_items1(i_data jsonb)
RETURNS TABLE(
   fulfiller_id varchar, 
   item_id varchar, 
   order_id varchar, 
   status_id integer, 
   item_updated_time timestamp without time zone)
AS $function$
DECLARE
    itemId1 varchar := null;
    statusId1 integer := 1000;
    quantity1 numeric;
begin
--SELECT t->>'itemId' itemId ,t->>'statusId' statusId,(t->>'quantity')::numeric quantity INTO itemId1,statusId1,quantity1 FROM jsonb_array_elements(i_data  -> 'items') t ;
   INSERT INTO vw_item_status_detail(
      fulfiller_id,
      item_id,
      order_id,
      status_id,
      sku_code,
      decoration_technology,
      quantity,
      item_updated_time)
   SELECT 
      i_data->>'fulfillerId' fulfillerId, 
      t->>'itemId' itemId, 
      i_data->>'orderId' orderId, 
      1000,
      t->>'skuCode' skuCode,
      t->>'decorationTechnology' decorationTechnology,
      (t->>'quantity')::numeric quantity ,
      NOW()
   FROM jsonb_array_elements(i_data  -> 'items') t ;
   exception when unique_violation then
  update vw_item_status_detail v1 set quantity = coalesce (quantity1 , V1.quantity ), status_id = coalesce (statusId1, V1.status_id ), item_updated_time = now() where v1.item_id = itemId1 ; 
  
   RETURN QUERY SELECT 
         v.fulfiller_id fulfiller_id,
         v.item_id item_id,
         v.order_id order_id,
         v.status_id status_id, 
         v.item_updated_time item_updated_time 
   FROM vw_item_status_detail v 
   WHERE (v.order_id = (SELECT i_data->>'orderId') )
   AND (v.fulfiller_id = (SELECT i_data->>'fulfillerId'));
END;
$function$
LANGUAGE plpgsql;

将sp调用与JSON一起

select * from sp_post_items1('{"orderId": "newtestput1",
 "fulfillerId":"kv0fdt6cx7",
"orderDetailsUrl":"het",
"items":[
    {
        "attributes":
            [{"name":"OracleSku","value":"DWj"},{"name":"taskId","value":"33a1595-e36769876c52"},{"name":"height","value":"5.5"},
            {"name":"width","value":"32.004"},{"name":"productFamily","value":"DWT"},{"name":"template","value":"GI-AST70W"},
            {"name":"labelInfo","value":"DWU-ROHS,LMQ-DBLU-BLU"},{"name":"decorationTechnology","value":"laserEngraving"},
            {"name":"material","value":"Rubber LMQ + LHY"},{"name":"XYZ_barcode","value":"21234348.1"},{"name":"orderType","value":"text"},
            {"name":"scheduledShipDate","value":"2020-09-12T23:59:00"},{"name":"orderReference","value":"21235677.9"},{"name":"docRefUrl","value":""},{"name":"additionalInfo","value":""}],
        "decorationTechnology":"laserEngraving","itemDescription":"Test Sku for Oracle testing",
"itemId":"item1",
        "manufacturingUrl":"htighess",
        "skuCode":"CIM-QYXB3789","productName":"Test Sku for Oracle testing","quantity":"2000","taskId":"33a1ea44-1f45-4f2d-9595-e36769876c52"
    },
    {
        "attributes":
            [{"name":"OracleSku","value":"DWT-XXX-B3LUX-BB-C"},{"name":"taskId","value":"33a1ea44-1f45-4f6c52"},{"name":"height","value":"5.5"},
            {"name":"width","value":"32.004"},{"name":"productFamily","value":"DWT"},{"name":"template","value":"GIFTSET-DWT-INDX-AST70W"},
            {"name":"labelInfo","value":"DWK-DBLU-BLU"},{"name":"decorationTechnology","value":"laserEngraving"},
            {"name":"material","value":"Rubber LMQ + LHY"},{"name":"XYZ_barcode","value":"21234348.1"},{"name":"orderType","value":"text"},
            {"name":"scheduledShipDate","value":"2020-09-12T23:59:00"},{"name":"orderReference","value":"21235677.9"},{"name":"docRefUrl","value":""},{"name":"additionalInfo","value":""}],
        "decorationTechnology":"laserEngraving","itemDescription":"Test Sku for Oracle testing",
"itemId":"item2",
        "manufacturingUrl":"httpdfg",
        "skuCode":"CIM-QYXB3789","productName":"Test Sku for Oracle testing","quantity":"1000","taskId":"33a1edfge36769876c52"
    }
]
}'::jsonb)

尝试使用for循环,但这并不是处理这种情况的最优化方法

尝试的方法:1.创建一个临时表,但未成功

1 个答案:

答案 0 :(得分:0)

在这种情况下,我们可以从/ in in子句组合子句中插入和更新用户