Sqlite: добавить новый элемент в существующий массив

Из документа 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') 
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
5
0
894
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

По-видимому, нет функции или простого способа сделать это, но мы можем добиться этого:

  • Разбиение каждого значения массива на строку с помощью json_each
  • Добавление строк для значений, которые мы хотим добавить с помощью UNION ALL
  • Группировка их с помощью подзапроса и GROUP BY
  • Собираем их обратно вместе с json_group_array

Например, если у вас есть таблица Messages с PRIMARY KEY 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]'

Другие вопросы по теме