代码之家  ›  专栏  ›  技术社区  ›  user2263572

Postgres更新JSON列中所有记录的第一条记录

  •  0
  • user2263572  · 技术社区  · 6 年前

    我有一个“orders”表,它有一个类型为JSON的列“orderData”。

    orderData列中的每条记录当前的样子:

    [{"orderId":1}, {"orderId":2}, {"orderId":3}]
    

    我正在尝试编写一个sql查询,为每个数组中的一阶对象添加一个键。

    orderData列中的每条记录在查询后应该是什么样的:

    [{"orderId":1, "isFirstOrder": true}, {"orderId":2}, {"orderId":3}]
    

    不工作尝试:

    WITH order AS (
      SELECT orderData
      FROM orders
      CROSS APPLY OPENJSON(c) s
      WHERE i = 1
    )
    UPDATE order
    SET c = JSON_MODIFY(c, 'isFirstOrder', 'true');
    

    任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  1
  •   S-Man    6 年前

    demo:db<>fiddle

    UPDATE orders
    SET c = jsonb_set(c, '{0}', c -> 0 || '{"isFirstOrder": true}');
    
    1. c -> 0 获取数组的第一个元素
    2. || 添加新属性
    3. jsonb_set {0} 在数组中定位重写位置

    Postgres JSON functions


    json 没有功能 json_set . 所以你必须在你的生活中 json文件 jsonb 最后的结果是 :

    UPDATE orders
    SET c = jsonb_set(c::jsonb, '{0}', c::jsonb -> 0 || '{"isFirstOrder": true}')::json
    

    demo:db<>fiddle