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;
对比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
并不
is
mysql中的
null
。所以需要把键值转换为字符串再作比较:
//->>'$.{}'得到的值会被转换成字符串,即可与'null'做比较判断
select * from json_data where data->>'$.address.state' != 'null';