Sqlite:将新元素附加到现有数组

时间:2018-03-23 14:20:12

标签: json sqlite

来自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') 

3 个答案:

答案 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]'