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

Postgresql Postgres更新JSON列中所有记录的第一条记录,postgresql,Postgresql,我使用的是postgres 9.6.1 我有一个“orders”表,它有一个类型为JSON的列“orderData” orderData列中的每条记录当前的样子: [{"orderId":1}, {"orderId":2}, {"orderId":3}] [{"orderId":1, "isFirstOrder": true}, {"orderId":2}, {"orderId":3}] WITH order AS ( SELECT orderData FROM orders C

我使用的是postgres 9.6.1

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

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

[{"orderId":1}, {"orderId":2}, {"orderId":3}]
[{"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');
我试图编写一个sql查询,为每个数组中的一阶对象添加一个键

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

[{"orderId":1}, {"orderId":2}, {"orderId":3}]
[{"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');
不工作尝试:

[{"orderId":1}, {"orderId":2}, {"orderId":3}]
[{"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');
任何帮助都将不胜感激。

  • c->0
    获取数组的第一个元素
  • | |
    添加新属性
  • jsonb_set
    重写存在的元素,而
    {0}
    在数组中定位重写位置

  • 对于类型
    json
    没有函数
    json\u set
    。因此,您必须将
    json
    数据转换为
    jsonb
    ,并将最终结果返回到
    json

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

    您在哪里找到了
    cross-apply
    openjson()
    json\u modify()
    ?我在文档中没有找到它。我在另一个stackoverflow答案中发现了它,当时我无法从pg文档中找到如何执行此操作。Fiddle非常完美。但当我尝试在数据库中运行它时,它失败了。“错误:函数jsonb_集(json,未知,文本)不存在”。我在本专栏中存储的数据可能存在问题?更新了我对json类型的回答。