【问题标题】:Postgresql : Best way to handle upsert with Jsonb data in PostgresqlPostgresql:在 Postgresql 中使用 Jsonb 数据处理 upsert 的最佳方法
【发布时间】:2020-10-20 13:22:23
【问题描述】:

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

主键: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;

带有 JSON 的 sp 调用示例

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.创建临时表,但没有成功

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    在这种情况下,我们可以使用 from / not in 子句组合子句来插入和更新

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多