mysql 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’)。这里address是从data中取出的json类型属性,用->提取的仍返回json类型,因此可以继续从address中取出state属性。 **
->>返回一个字符串类型的值,这意味着不能再使用 JSON 相关的函数和操作符来处理返回的结果,比如不能再使用 -> 来获取 JSON 对象的属性值。但是可以直接对返回的字符串进行字符串函数的操作。

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

在这里插入图片描述
对比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';

在这里插入图片描述

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

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

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

在这里插入图片描述


表数据很简单,按理说上面的查询语句结果应该为空.但实际上:
在这里插入图片描述
查出来了。。。
语句换成以下

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

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

//->>'$.{}'得到的值会被转换成字符串,即可与'null'做比较判断
select * from json_data where data->>'$.address.state' != 'null';
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值