使用 SQLite/json1 扩展(append、tail)处理数组

问题描述 投票:0回答:1

sqlite3 的 json1 扩展允许查询和操作 JSON 值(存储的文本字段)。我想将一个新元素附加到驻留在某个 JSON 值(在 SQLite 数据库中)内的 JSON 数组。 不幸的是,在使用动态大小的数组(长度未知)时,对 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 中可以用更优雅的方式解决这个问题吗?

sqlite sqlite-json1
1个回答
0
投票

特殊索引'#'

您可以使用带有索引“#”的 json_insert 附加到数组,这意味着在最后一个元素之后。

UPDATE t SET data = json_insert(data,'$[#]', 42);
© www.soinside.com 2019 - 2024. All rights reserved.