当sqlite json作为数组具有值时,如何正确提取
我有一个sqlite数据库,在其中一个字段中存储了完整的json对象。我必须发出一些json select请求。如果你看到我的json ALL键的值为数组我们需要提取一些数据,比如“pod”字段为fb的所有注释。当sqlite json作为数组具有值时,如何正确提取 从datatable中选择json_提取(数据,$.“json”);给了我全部的东西。那我会的 选择json_extract(数据“$.”json“[0]”),但我不想手动执行。我想迭代 请建议一些来源,我可以在那里学习和工作。 我的JSON当sqlite json作为数组具有值时,如何正确提取,json,sqlite,sqlite-json1,Json,Sqlite,Sqlite Json1,我有一个sqlite数据库,在其中一个字段中存储了完整的json对象。我必须发出一些json select请求。如果你看到我的json ALL键的值为数组我们需要提取一些数据,比如“pod”字段为fb的所有注释。当sqlite json作为数组具有值时,如何正确提取 从datatable中选择json_提取(数据,$.“json”);给了我全部的东西。那我会的 选择json_extract(数据“$.”json“[0]”),但我不想手动执行。我想迭代 请建议一些来源,我可以在那里学习和工作。 我
{
"ALL": [{
"comments": "your site is awesome",
"pod": "passcode",
"originalDirectory": "case1"
},
{
"comments": "your channel is good",
"data": ["youTube"],
"pod": "library"
},
{
"comments": "you like everything",
"data": ["facebook"],
"pod": "fb"
},
{
"data": ["twitter"],
"pod": "tw",
"ALL": [{
"data": [{
"codeLevel": "3"
}],
"pod": "mo",
"pod2": "p"
}]
}
]
}
create table datatable ( path string , data json1 );
insert into datatable values("1" , json('<abovejson in a single line>'));
{
“全部”:[{
“评论”:“你的网站棒极了”,
“pod”:“密码”,
“原董事会”:“案例1”
},
{
“评论”:“你的频道很好”,
“数据”:[“youTube”],
“pod”:“库”
},
{
“评论”:“你喜欢一切”,
“数据”:[“facebook”],
“pod”:“fb”
},
{
“数据”:[“推特”],
“pod”:“tw”,
“全部”:[{
“数据”:[{
“代码级别”:“3”
}],
“pod”:“mo”,
“pod2”:“p”
}]
}
]
}
创建表datatable(路径字符串,数据json1);
插入数据表值(“1”,json(“”));
简单列表
如果您的JSON表示一个“简单”的注释列表,那么您需要如下内容:
select key, value
from datatable, json_each( datatable.data, '$.ALL' )
where json_extract( value, '$.pod' ) = 'fb' ;
使用您的示例数据,返回:
2|{"comments":"you like everything","data":["facebook"],"pod":"fb"}
使用json\u each()
为输入json的每个元素返回一行(datatable.data
),从路径$.ALL
(其中$
是顶级,而ALL
是数组的名称:如果需要json对象的顶级,则可以省略路径)。在您的情况下,这将为每个注释条目返回一行
这一行的字段记录在SQLite文档中:我们感兴趣的两个字段是key
(非常粗略地称为“行号”)和value
(当前元素的JSON)。后者将包含名为comment
和pod
等元素
因为我们只对pod
等于fb
的元素感兴趣,所以我们添加了where
子句,使用json\u extract()
获取pod
(其中$。pod
与json\u each
函数返回的值相关)
嵌套列表
如果您的JSON包含嵌套元素(一开始我没有注意到),那么您需要使用JSON\u tree()
函数,而不是JSON\u each()
。后者将只迭代指定节点的直接子节点,json_tree()
将递归地向下遍历指定节点的所有子节点
为了给我们提供一些数据,我用一个额外的元素增加了您的测试数据:
create table datatable ( path string , data json1 );
insert into datatable values("1" , json('
{
"ALL": [{
"comments": "your site is awesome",
"pod": "passcode",
"originalDirectory": "case1"
},
{
"comments": "your channel is good",
"data": ["youTube"],
"pod": "library"
},
{
"comments": "you like everything",
"data": ["facebook"],
"pod": "fb"
},
{
"data": ["twitter"],
"pod": "tw",
"ALL": [{
"data": [{
"codeLevel": "3"
}],
"pod": "mo",
"pod2": "p"
},
{
"comments": "inserted by TripeHound",
"data": ["facebook"],
"pod": "fb"
}]
}
]
}
'));
如果我们简单地切换到使用json\u each()
,那么我们会看到一个简单的查询(没有where
子句)将返回源json的所有元素:
select key, value
from datatable, json_tree( datatable.data, '$.ALL' ) limit 10 ;
ALL|[{"comments":"your site is awesome","pod":"passcode","originalDirectory":"case1"},{"comments":"your channel is good","data":["youTube"],"pod":"library"},{"comments":"you like everything","data":["facebook"],"pod":"fb"},{"data":["twitter"],"pod":"tw","ALL":[{"data":[{"codeLevel":"3"}],"pod":"mo","pod2":"p"},{"comments":"inserted by TripeHound","data":["facebook"],"pod":"fb"}]}]
0|{"comments":"your site is awesome","pod":"passcode","originalDirectory":"case1"}
comments|your site is awesome
pod|passcode
originalDirectory|case1
1|{"comments":"your channel is good","data":["youTube"],"pod":"library"}
comments|your channel is good
data|["youTube"]
0|youTube
pod|library
由于JSON对象与简单值混合在一起,我们不能再简单地在JSON_extract(value,$.pod')='fb'
中添加,因为当value
不表示对象时,这会产生错误。最简单的方法是查看由json_each()
/json_tree()
返回的type
值:如果行表示json对象,则这些值将是字符串object
(有关其他值,请参阅上述文档)
将其添加到where
子句中(并依靠“短路评估”防止对非对象行调用json\u extract()
),我们得到:
返回:
2|{"comments":"you like everything","data":["facebook"],"pod":"fb"}
1|{"comments":"inserted by TripeHound","data":["facebook"],"pod":"fb"}
如果需要,我们可以使用json\u extract()
来分解返回的对象:
.mode column
.headers on
.width 30 15 5
select json_extract( value, '$.comments' ) as Comments,
json_extract( value, '$.data' ) as Data,
json_extract( value, '$.pod' ) as POD
from datatable, json_tree( datatable.data, '$.ALL' )
where type = 'object'
and json_extract( value, '$.pod' ) = 'fb' ;
Comments Data POD
------------------------------ --------------- -----
you like everything ["facebook"] fb
inserted by TripeHound ["facebook"] fb
注意:如果您的结构包含其他不同格式的对象,仅选择type='object'
:您可能需要设计一个更微妙的过滤过程。将此json_提取(数据,“$”json“[0]”)放入循环中。请您指导如何操作。任何指向文档的链接都将真正帮助string
和json1
的列类型?你应该仔细阅读。你要找的是。@Shawn。你能举个例子吗。我无法理解这方面的文档。谢谢先生:)这对于第一级来说是可以的。如果你看到“数据”[“twitter”],它还有另一个“ALL”,那么我们将如何进入处于第二级ie的JSON呢。这个问题将变得复杂。任何建议都可能有助于。。。它类似于json\u each
,但(IIRC:我不在我的电脑旁)它是从嵌套的层上降下来的。@MAG我添加了一种使用json\u tree()
来(希望)做你想做的事的方法。。。
.mode column
.headers on
.width 30 15 5
select json_extract( value, '$.comments' ) as Comments,
json_extract( value, '$.data' ) as Data,
json_extract( value, '$.pod' ) as POD
from datatable, json_tree( datatable.data, '$.ALL' )
where type = 'object'
and json_extract( value, '$.pod' ) = 'fb' ;
Comments Data POD
------------------------------ --------------- -----
you like everything ["facebook"] fb
inserted by TripeHound ["facebook"] fb