sqlite3的json1扩展允许查询和操作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路径表达式,然后将其反馈到json_insert
以找到正确的位置。
获取最后一个元素可以用同样的方式完成:
SELECT json_extract(DATA,
'$[' || (json_array_length(json_extract(DATA, '$')) - 1) || ']')
FROM T;
这看起来非常麻烦。我希望像$[-1]
路径这样的东西,但似乎并不支持。
这可以在SQLite中以更优雅的方式解决吗?