来自sqlite3 doc
select json_insert('{"a":2,"c":4}', '$.e', 99) -- → '{"a":2,"c":4,"e":99}'
但是如何将新元素附加到数组?
select json_insert('[1,2,3]', ??, 4) -- → '[1, 2, 3, 4]'
update someTable set someArray = json_insert(someArray, ??, 'some new value')
答案 0 :(得分:4)
经过几次试验,我终于想通了
update some_table
set some_array = json_insert(
some_array,
'$[' || json_array_length(some_array) || ']',
'new item'
)
where id = some_id;
答案 1 :(得分:1)
显然没有任何功能或简单方法,但我们可以通过以下方式实现目标:
json_each
UNION ALL
GROUP BY
json_group_array
例如,如果您在Messages
中有一个带有PRIMARY KEY id
的{{1}}表和一个JSON数组,则可以在所有行的帐户数组中添加一个元素:
account
我们需要再次换行以放入SELECT id, json_group_array(value) FROM (
SELECT Messages.id, json_each.value
FROM Messages, json_each(Messages.account)
UNION ALL SELECT Messages.id, 'new_account' FROM Messages
) GROUP BY id;
,因为SQLite不支持UPDATE
+ UPDATE
。这会将新帐户添加到所有行:
JOIN
如果您只想更新这样一行,我们可以简化这个:
UPDATE Messages SET account = (SELECT account FROM (
SELECT id, json_group_array(value) as account FROM (
SELECT Messages.id, json_each.value
FROM Messages, json_each(Messages.account)
UNION ALL SELECT Messages.id, 'new_account' FROM Messages
) GROUP BY id
) WHERE id = Messages.id);
答案 2 :(得分:1)
在版本 3.31.0 中引入了一个新符号来直接支持此功能:
select json_insert('[1,2,3]', '$[#]', 4) -- → '[1, 2, 3, 4]'