假设我们有这样的数据库表:
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”}] |
您可以使用
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"}]