sqlite 使用JSON_EXTRACT后基于2个JSON属性的过滤器

ws51t4hk  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(405)

导入的数据库表:

id           | JSON
-------------|---------
Signed 32int | Raw JSON

通过JSON数据的属性进行搜索比通过行本身的id进行搜索更容易。每段JSON数据都包含(对于本演示):

json: {
displayProperties: {},
hash: "foo"
itemType: "bar"
}

当我选择我想要匹配散列,然后通过匹配的itemType过滤那些结果。
我的疑问是:

SELECT json_extract(ItemDefinition.json, '$') 
 FROM ItemDefinition, json_tree(ItemDefinition.json, '$')
  WHERE json_tree.key = 'hash' AND json_tree.value IN ${hashList}

但是,这将返回具有匹配散列值的每一项。从这里开始,我还想通过键:itemType和值:“19”进行筛选。所以我试着:

SELECT json_extract(ItemDefinition.json, '$') 
 FROM ItemDefinition, json_tree(ItemDefinition.json, '$')
  WHERE json_tree.key = 'hash' AND json_tree.value IN ${hashList}
   AND WHERE json_tree.key = 'itemType' AND json_tree.value = 19

但这在语法上是不正确的,更不用说输出我正在寻找的东西了。错误:
SQLITE_ERROR:靠近“WHERE”:语法错误

l7wslrjt

l7wslrjt1#

这道题的题目与我想要的并不相符。我不知道json_tree到底做了什么。Json_tree实际上使用数据库填充的值构建了一个新对象。
我实际上想要的是根据json列中的特定值进行过滤,这可以通过json_Extract来实现。json_extract('{column}', $.{filterValue})将把原始json对象从json列中拉出
这就是现在对我有效的查询:

SELECT json_extract(ItemDefinition.json, '$') 
    FROM ItemDefinition, json_tree(ItemDefinition.json, '$')
       WHERE json_tree.key = 'hash' 
       AND json_tree.value IN ${hashList} 
       AND json_extract(ItemDefinition.json, '$.itemType') = 19

这将从ItemDefinition中选择json列
从json列创建一个json_tree
按json树keyvalue筛选结果
最终通过原始json列中的属性itemType进行筛选

相关问题