【问题标题】:Sqlite: append a new element to an existing arraySqlite:将新元素附加到现有数组
【发布时间】:2018-09-02 06:07:51
【问题描述】:

来自 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 sqlite sqlite-json1


    【解决方案1】:

    显然没有功能或简单的方法可以做到这一点,但我们可以通过:

    • 使用json_each 将每个数组值分成一行
    • 为我们要添加的值添加行UNION ALL
    • 使用子查询和GROUP BY 对它们进行分组
    • 将它们与json_group_array 一起打包回来

    例如,如果您有一个带有主键idMessages 表和account 中的一个JSON 数组,您可以在所有行中向帐户数组中添加一个元素:

    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 + JOIN,我们需要再次包装以放入 UPDATE。这会将新帐户添加到所有行:

    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;
    

    【讨论】:

      【解决方案2】:

      经过几次尝试,我终于想通了

      update some_table
        set some_array = json_insert(
          some_array,
          '$[' || json_array_length(some_array) || ']',
          'new item'
        )
        where id = some_id;
      

      【讨论】:

        【解决方案3】:

        3.31.0 版本中引入了一种新符号来直接支持此功能:

        select json_insert('[1,2,3]', '$[#]', 4) -- → '[1, 2, 3, 4]'
        

        【讨论】:

          猜你喜欢
          • 2020-04-03
          • 2014-06-27
          • 2021-12-26
          • 2021-07-04
          • 2018-08-18
          • 2014-02-24
          • 1970-01-01
          • 2017-08-05
          • 1970-01-01
          相关资源
          最近更新 更多