当sqlite 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]”),但我不想手动执行。我想迭代 请建议一些来源,我可以在那里学习和工作。 我

我有一个sqlite数据库,在其中一个字段中存储了完整的json对象。我必须发出一些json select请求。如果你看到我的json ALL键的值为数组我们需要提取一些数据,比如“pod”字段为fb的所有注释。当sqlite json作为数组具有值时,如何正确提取

从datatable中选择json_提取(数据,$.“json”);给了我全部的东西。那我会的 选择json_extract(数据“$.”json“[0]”),但我不想手动执行。我想迭代

请建议一些来源,我可以在那里学习和工作。 我的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"
            }]
        }
    ]
}



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