Работа с массивами с расширением SQLite/json1 (append, tail)
Расширение json1 sqlite3 позволяет запрашивать и манипулировать JSON-значениями (сохраненные поля TEXT). Я хочу добавить новый элемент в JSON-массив, находящийся внутри некоторого JSON-значения (в базе данных SQLite). К сожалению, поддержка JSON-массивов кажется неоптимальной при работе с массивами динамического размера (неизвестной длины).
У меня есть тривиальная таблица, в которой хранятся значения JSON.
CREATE TABLE T (DATA);
В этой таблице будут значения JSON, которые состоят из массива JSON в качестве корневого узла, например:
INSERT INTO T VALUES(json_array(1,2,3,4,5));
Чтобы добавить массив, который находится по пути "$" (для простоты), я могу выполнить следующий запрос:
UPDATE T SET DATA =
(SELECT json_insert(DATA,
'$[' || json_array_length(json_extract(DATA, '$')) || ']', 42));
Это работает, но кажется довольно ужасным; я первый json_extract
массив, а затем вычислить его длину. Затем эта длина объединяется в новое выражение JSON-path, которое затем возвращается обратно в json_insert
найти правильное место. Получить последний элемент можно так же:
SELECT json_extract(DATA,
'$[' || (json_array_length(json_extract(DATA, '$')) - 1) || ']')
FROM T;
Это кажется довольно громоздким. Я надеялся на что-то вроде $[-1]
путь, но это, кажется, не поддерживается. Можно ли решить эту проблему более элегантным способом в SQLite?