Sqlite:将新元素附加到现有数组
Sqlite: append a new element to an existing array
来自 sqlite3 文档
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')
显然没有任何功能或简单的方法可以做到这一点,但我们可以通过以下方式实现:
- 使用
json_each
将每个数组值分成一行
- 为我们要使用
UNION ALL
添加的值添加行
- 用 sub-query 和
GROUP BY
将它们分组
- 将它们与
json_group_array
一起打包回去
例如,如果您有一个 Messages
table 主键 id
和一个 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;
我们需要再次包装以放入 UPDATE
,因为 SQLite 不支持 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);
如果您只想更新一行,我们可以简化此操作:
UPDATE Messages SET account = (
SELECT json_group_array(value) FROM (
SELECT json_each.value
FROM Messages, json_each(Messages.account)
WHERE Messages.id = 123456789
UNION ALL SELECT 'new_account'
) GROUP BY ''
) WHERE id = 123456789;
经过几次试验,终于想通了
update some_table
set some_array = json_insert(
some_array,
'$[' || json_array_length(some_array) || ']',
'new item'
)
where id = some_id;
版本 3.31.0 中引入了一种新的表示法来直接支持此功能:
select json_insert('[1,2,3]', '$[#]', 4) -- → '[1, 2, 3, 4]'
来自 sqlite3 文档
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')
显然没有任何功能或简单的方法可以做到这一点,但我们可以通过以下方式实现:
- 使用
json_each
将每个数组值分成一行
- 为我们要使用
UNION ALL
添加的值添加行
- 用 sub-query 和
GROUP BY
将它们分组
- 将它们与
json_group_array
一起打包回去
例如,如果您有一个 Messages
table 主键 id
和一个 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;
我们需要再次包装以放入 UPDATE
,因为 SQLite 不支持 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);
如果您只想更新一行,我们可以简化此操作:
UPDATE Messages SET account = (
SELECT json_group_array(value) FROM (
SELECT json_each.value
FROM Messages, json_each(Messages.account)
WHERE Messages.id = 123456789
UNION ALL SELECT 'new_account'
) GROUP BY ''
) WHERE id = 123456789;
经过几次试验,终于想通了
update some_table
set some_array = json_insert(
some_array,
'$[' || json_array_length(some_array) || ']',
'new item'
)
where id = some_id;
版本 3.31.0 中引入了一种新的表示法来直接支持此功能:
select json_insert('[1,2,3]', '$[#]', 4) -- → '[1, 2, 3, 4]'