如何解决带条件过滤器的Mysql Json提取
我正在尝试通过过滤器查询一些json数据。给定这样的json数组:
[ {name:'name1',country:[{name:'France',people:10},{name:'Japan',people:20}]},{name:'name2',people:20},people:40}]}]
我想选择所有属性名称设置为“法国”的对象中所有具有国家名称“法国”且值大于10的行作为“人民”。
非常感谢您
解决方法
首先,它不是有效的JSON,因此MySQL中的JSON函数均无法正常工作。在有效的JSON中,您不能使用诸如'
之类的单引号来分隔键或字符串。您必须使用双引号,例如"
。
还必须用双引号(而不只是值)来分隔键。
因此您的数据应如下所示:
[
{
"name": "name1","country": [
{
"name": "France","people": 10
},{
"name": "Japan","people": 20
}
]
},{
"name": "name2","people": 20
},"people": 40
}
]
}
]
如果将其加载到表中:
create table mytable (id serial primary key,data json);
insert into mytable set data = '...JSON based on the above...';
然后我们可以使用MySQL 8.0的JSON_TABLE()函数:
select mytable.id,j.*
from mytable,json_table(mytable.data,'$[*]' columns (
name varchar(20) path '$.name',nested path '$.country[*]' columns (
country_name varchar(20) path '$.name',country_people int path '$.people')
)
) as j
输出:
+----+-------+--------------+----------------+
| id | name | country_name | country_people |
+----+-------+--------------+----------------+
| 1 | name1 | France | 10 |
| 1 | name1 | Japan | 20 |
| 1 | name2 | France | 20 |
| 1 | name2 | Japan | 40 |
+----+-------+--------------+----------------+
然后我们可以像搜索普通表一样对其进行搜索:
select mytable.id,j.*
from mytable,country_people int path '$.people')
)
) as j
where j.country_name = 'France' and j.country_people = 10;
+----+-------+--------------+----------------+
| id | name | country_name | country_people |
+----+-------+--------------+----------------+
| 1 | name1 | France | 10 |
+----+-------+--------------+----------------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。