从sqlite中的对象的json列表中提取部分数据

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

假设我们有这样的数据库表:

CREATE TABLE tbl (id INT PRIMARY KEY, data JSON);
和 json 数据如下:

INSERT INTO tbl (data) VALUES ('[
        {
                "name": "object 1",
                "key": "value 1",
                "unwanted key": "unwanted value 1"
        },
        {
                "name": "object 2",
                "key": "value 2",
                "unwanted key": "unwanted value 2"
        }
]');

现在我只想提取部分数据,同时将其保留为对象列表,每个对象都只有

name
key
键,但没有
unwanted key
。此外,如果我在数据列中有多行具有相同的结构化列表,则在选择所有数据时,我需要能够区分(例如通过 id)。

我尝试使用

json_each
json_extract
的组合来执行此操作,就像本例中那样,但这为我提供了列表中每个对象的结果,而不是每个列表的结果,我不知道如何改变这一点。

也可以只拆分表格并仅为

unwanted key
创建一个新列,但这将使我将其全部放在应用程序中的另一个点上。但是,如果使用这种结构无法进行查询,我会转而更改架构。

编辑以添加预期结果:

假设我们插入相同的列表两次,我想得到这个输出:

id 数据
1 [{“名称”:“对象 1”,“键”:“值 1”},{“名称”:“对象 2”,“键”:“值 2”}]
2 [{“名称”:“对象 1”,“键”:“值 1”},{“名称”:“对象 2”,“键”:“值 2”}]
sql sqlite
1个回答
0
投票

您可以使用

json_each
json_object
json_group_array
的组合提取所选列,如下所示:

select
  id,
  (select json_group_array(
    json_object('name', value->'$.name', 'key', value->'$.key')
   )
   from json_each(data)) as data
from tbl;

输入:

CREATE TABLE tbl (id INT PRIMARY KEY, data JSON);

INSERT INTO tbl (id, data) VALUES (1, '[
        {
                "name": "object 1",
                "key": "value 1",
                "unwanted key": "unwanted value 1"
        },
        {
                "name": "object 2",
                "key": "value 2",
                "unwanted key": "unwanted value 2"
        }
]'), (2, '[
        {
                "name": "object 3",
                "key": "value 3",
                "unwanted key": "unwanted value 3"
        }
]');

输出:

1|[{"name":"object 1","key":"value 1"},{"name":"object 2","key":"value 2"}]
2|[{"name":"object 3","key":"value 3"}]
© www.soinside.com 2019 - 2024. All rights reserved.