添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接



mysql中json类型数据查询

  • 查询返回所有包含键值对 {"key": "value"} 的JSON对象
  • 根据json中对象的值来查询数据


查询返回所有包含键值对 {“key”: “value”} 的JSON对象

用json_contains函数查询json包含某特定键值对的数据.
例如,假设有一个名为 json_data 的表,其中包含一个名为 data 的JSON类型列,可以使用以下查询来检索包含特定键值的JSON数据::

\\data
  "name": "John",
  "age": 30,
  "address": {
    "city": "New York",
    "state": null
//查询json中包含某一键值对的数据
select * from json_data where json_contains(data,'{"name": "John"}');
select * from json_data where json_contains(data,'{"age": 30}');

根据json中对象的值来查询数据

可以使用 -> 或 ->> 运算符从JSON对象中提取值。
注意:
-> 返回一个 JSON 类型的值,这意味着可以继续使用 JSON 相关的函数和操作符来处理返回的结果,比如可以使用 -> 来获取 JSON 对象的属性值(eg.data->‘$.address.state’)。
->> 返回一个字符串类型的值,这意味着不能再使用 JSON 相关的函数和操作符来处理返回的结果,比如不能再使用 -> 来获取 JSON 对象的属性值。但是可以直接对返回的字符串进行字符串函数的操作。

//各类型键值对对应的值
select data->'$.name',data->>'$.name', data->'$.age',data->>'$.age'  from json_data;

mysql 5.6 json 查询 mysql json in查询_JSON


对比name属性可以看出, -> 提取的键值返回的就是json中的类型(在这里是字符串),而 ->> 提取的键值被转换成mysql的字符串.下面是对比它们的用法区别:

1.select * from json_data where data->'$.age' = 30;
2.select * from json_data where data->>'$.age' = 30;
3.select * from json_data where data->'$.age' = '30';
4.select * from json_data where data->>'$.age' = '30';
5.select * from json_data where data->'$.name' = 'John';
6.select * from json_data where data->>'$.name' = 'John';

mysql 5.6 json 查询 mysql json in查询_JSON_02

结果仅有3查询结果为空,因为 data->'$.age' 得到的值是根据在json中的格式(此处应是整型),所以判断='30’结果不匹配。

然后坑就来了
假如要查询 键值为null或者不为null 的数据,用以下查询语句:

select * from json_data where data->'$.address.state' is not null;

mysql 5.6 json 查询 mysql json in查询_JSON_03


表数据很简单,按理说上面的查询语句结果应该为空.但实际上:

mysql 5.6 json 查询 mysql json in查询_字符串_04


查出来了。。。

语句换成以下

select * from json_data where data->>'$.address.state' is not null;

结果依然不为空。
解决: 理解上述 -> ->> 的区别再结合一个很重要的小知识 mysql中的 null 用于表示缺少值或未知值。它不等于空字符串、0或任何其他值。 因此json中的 null 并不 is mysql中的 null 。所以需要把键值转换为字符串再作比较:

//->>'$.{}'得到的值会被转换成字符串,即可与'null'做比较判断
select * from json_data where data->>'$.address.state' != 'null';


在使用 pip 安装时,你会发现有下载进度条,我们也可以借助开源的第三方库来实现这个功能,在项目输出时增加一些可视化效果。 一个简单易用的第三方库是:progress作者提供了动图很直观地展现了实现的所有输出。 这个库实现了两类样式,一类是有终点的进度条样式,另一类是多用于加载的转圈样式。import time from progress.bar import Bar 2.【Python】序列 - 数据容器 ( 序列简介 | 序列切片 | 省略 起始坐标 / 结束坐标 / 步长 切片 | 列表切片 | 字符串切片 | 元组切片 | 步长 -1 的切片 ) 3.Java动态代理:优化静态代理模式的灵活解决方案 4.Python-练脑系列-03数据结构 5.LoadLibrary;HINSTANCE hDll=GetModuleHandle("Win32_2.dll");