微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带条件过滤器的Mysql Json提取

如何解决带条件过滤器的Mysql Json提取

我正在尝试通过过滤器查询一些json数据。给定这样的json数组:

[ {name:'name1',country:[{name:'France',people:10},{name:'Japan',people:20}]},{name:'name2',people:20},people:40}]}]

我想选择所有属性名称设置为“法国”的对象中所有具有国家名称“法国”且值大于10的行作为“人民”。

通过MysqL JSON函数可以吗?

非常感谢您

解决方法

首先,它不是有效的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 举报,一经查实,本站将立刻删除。