在sqlite中使用json1查询JSON数组以获取多个值

时间:2019-04-10 23:25:26

标签: java sql json sqlite sqlite-json1

我正在尝试使用json1扩展名查询我的sqlite数据库,并想查询一个json数组以匹配多个值并返回与所有值匹配的条目。

实体示例:

实体1:

{
    EntityID: 123,
    tags: [tag1, tag2, tag3]
}

实体2:

{
    EntityID: 234,
    tags: [tag2, tag3]
}

在此示例中,我要查询与多个值匹配的标签。如果我的输入是[tag1, tag2],那么我只想返回Entity 1,而如果我的输入是tag2,那么我想返回两个实体。

我期望的查询是

SELECT * 
FROM entities, json_each(tags) 
WHERE json_each.value IS "tag1" 
    AND json_each.value IS "tag2"

但是此查询在所有情况下均失败。至于为什么失败,我认为它会尝试将数组的每个值都匹配为tag1tag2,但事实并非如此,因为每个元素只有1个值。这是有效的还是有其他解释?

在检查[tag1, tag2]值并仅返回Entity 1的非常特殊的用例中,对我有用的查询是

SELECT * 
FROM entities, json_each(tags) 
WHERE json_each.value IS "tag1" OR "tag2"

我想知道为什么在上述情况下它可以工作?我唯一想到的是它检查数组的每个值是tag1还是tag2,但我不明白为什么它返回也有值的Entity 1 tag3中的,并且不符合条件。但是,在大多数其他情况下,例如在我搜索[tag3, tag4]的情况下,这种情况将失败,在这种情况下,它会返回两个实体,但不应返回任何实体。所以这绝对不是答案

我仍然无法找到正确的方法来有效地进行查询,并正在寻找任何建议。

理想情况下,如果有一种甚至更简单的查询方法,那么将不胜感激。我想到的是,我可以为查询提供标记值的列表,并且它与所有标记值都匹配,而无需我使用AND / OR运算符

1 个答案:

答案 0 :(得分:0)

第一个查询首先获取tag1,将其与tag1和tag2比较,然后失败,然后获取另一个值。失败,因为该值不能同时为tag1和tag2。

我建议使用嵌套查询,将from子句替换为另一个查询