如何在 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 容易得多,更不用说快几个数量级了。
我在 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 容易得多,更不用说快几个数量级了。