如何通过在 sqlite 表中引用自身来更新 json 对象值?

Posted

技术标签:

【中文标题】如何通过在 sqlite 表中引用自身来更新 json 对象值?【英文标题】:How do I update a json object value by referencing itself in a sqlite table? 【发布时间】:2021-08-07 19:04:40 【问题描述】:

假设我有一个表 features,其中有一列 data 包含 json 对象。

CREATE TABLE features ( id INTEGER PRIMARY KEY, data json )

现在,一个示例数据对象可能是:

"A":
   "B":
      "coordinates":[
         "x":1, "y":1,
         "x":10, "y":10
       ]
    

现在我需要遍历data 列中的所有数据,并将coordinates 的值加倍。

我尝试将其设置为自己的值除以 0.5,但这似乎适用于第一行,然后将所有其他行设置为完全相同的值。

update features
set data = 
(select json_set(features.data, "$.A.B.coordinates[0].x", (select json_extract(features.data, "$.A.B.coordinates[0].x")/0.5 from features))
from features);

如何在json_set 中引用它自己的值并为每一行重复?遍历每一行并将坐标加倍的最佳方法是什么?

【问题讨论】:

【参考方案1】:

不需要SELECT 声明。 可以直接参考同一行data列的值:

UPDATE features
SET data = json_set(
             features.data, 
             "$.A.B.coordinates[0].x", json_extract(features.data, "$.A.B.coordinates[0].x") * 2
           );

或者,如果您想更新所有xs 和ys:

UPDATE features
SET data = json_set(
             features.data, 
             "$.A.B.coordinates[0].x", json_extract(features.data, "$.A.B.coordinates[0].x") * 2,
             "$.A.B.coordinates[0].y", json_extract(features.data, "$.A.B.coordinates[0].y") * 2,
             "$.A.B.coordinates[1].x", json_extract(features.data, "$.A.B.coordinates[1].x") * 2,
             "$.A.B.coordinates[1].y", json_extract(features.data, "$.A.B.coordinates[1].y") * 2
       );

请参阅demo。

【讨论】:

以上是关于如何通过在 sqlite 表中引用自身来更新 json 对象值?的主要内容,如果未能解决你的问题,请参考以下文章

通过 odbc 在 SQLITE 上的 power 查询中使用相关表中的计算列

我如何使用条件从其他表中更新表中的数据

如何索引 SQLite 表中的树?

使用内连接 SQLITE 从两个表中删除行

ASP.NET MVC 主视图引用的js(jquery)在分部视图中无效,如何解决?

使用引用表 SQL Server 更新表中的多条记录