繁体   English   中英

如何在 SQLite 的数组(json)中间插入一个元素?

[英]How to insert an element into the middle of an array (json) in SQLite?

我在SQLite文档的json部分找到了一个方法json_insert 但它似乎没有按照我预期的方式工作。

例如select json_insert('[3,2,1]', '$[3]', 4) as result;

result列返回'[3,2,1,4]' ,这是正确的。

但是对于select json_insert('[3,2,1]', '$[1]', 4) as result;

我期待返回类似'[3,2,4,1]'的内容,而不是'[3,2,1]'

我错过了什么吗? 我没有看到json_insert的替代方法。

PS我在https://sqlime.org/#demo.db上玩,SQLite版本是3.37.2

文档指出json_insert()不会覆盖值“如果已经存在则覆盖? - 否” )。 这意味着您不能在数组中间插入元素。

我的解释:function 主要是为了将键插入 object,这种行为更有意义——不改变数组的长度是为了一致性而牺牲的。

您可以通过将 JSON 数组转换为表格,附加您的元素,对结果进行排序,然后将其全部转换回 JSON 数组,将其硬塞进 SQLite:

select json_group_array(x.value) from (
    select key, value from json_each('[3,2,1]')
    union
    select 1.5, 4  -- 1.5 = after 1, before 2
    order by 1
) x

这将产生'[3,2,4,1]'

但是您可能会看到这不会扩展,即使有内置的 function 为您执行此操作,它也不会扩展。 字符串操作很慢。 对于一次性的或不经常使用的情况,它可能效果很好。

从长远来看,我会建议正确规范您的数据库结构,而不是将“非 blob”数据存储在 JSON blob 中。 处理规范化数据比处理 JSON 容易得多,更不用说快几个数量级了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM