如何在 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栏returns'[3,2,1,4]',是正确的。

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

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

我错过了什么吗?我没有看到 json_insert.

的替代方法

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

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

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

您可以通过将 JSON 数组转换为 table,附加您的元素,对结果进行排序,然后将其全部转换回 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]'

但您可能会发现这不会扩展,即使有一个 built-in 函数为您完成此操作,它也不会扩展。字符串操作很慢。它可能对 one-offs 或不经常使用时效果很好。

在长 运行 中,我建议正确规范化您的数据库结构,而不是将“non-blob”数据存储在 JSON blob 中。操作规范化数据比操作 JSON 容易得多,更不用说快几个数量级了。