Mysql内储存JSON字符串,如何根据json字段内容作为查询条件(包括json数组)检索数据

mysql5.7以上支持json的操作,以及增加了json存储类型
一般数据库存储json类型的数据会用json类型或者text类型

mysql根据json字段的内容检索查询数据

  • 使用 字段->'$.json属性'进行查询条件
  • 使用json_extract函数查询,json_extract(字段,"$.json属性")
  • 根据json数组查询,用JSON_CONTAINS(字段,JSON_OBJECT('json属性', "内容"))

比如如下数据

select * from log where data->'$.id' = 142;
或者 
select data->'$.id' id,data->'$.name' name from log where data->'$.id' = 142;

  对于JSON 数据的数据

用JSON_CONTAINS(字段,JSON_OBJECT(‘json属性’, “内容”))

select * from log2 where JSON_CONTAINS(data,JSON_OBJECT('id', "142"))

  通过以上的学习,下面是针对自己的业务数据而使用的查询语句和结果

-- 精确查询
select operator_name,objects  from feishu_log where JSON_CONTAINS(objects,JSON_OBJECT('object_name', "测试"));
-- 精确查询
select operator_name,objects,objects->'$[*].object_name' objectName from feishu_log where objects->'$[*].object_name' = '测试';
-- 模糊查询,而且返回json中的某个字段的内容
select operator_name,objects,objects->'$[*].object_name' objectName from feishu_log where objects->'$[*].object_name' like '%测试%';
-- 模糊查询,而且返回json中的某个字段的内容
select  operator_name,objects,objects->'$[*].object_name' objectName  FROM feishu_log   WHERE (objects ->> '$[*].object_name' LIKE CONCAT('%','测试','%')) ;

  精确查询无结果,模糊查询有结果

 

 使用lamda表达式去查询

queryWrapper.apply(oConvertUtils.isNotEmpty(feishuLog.getObjectName()), "objects ->> '$[*].object_name' LIKE CONCAT('%',{0},'%')", feishuLog.getObjectName());

 

posted @ 2022-10-19 11:33  张亮java  阅读(2589)  评论(0编辑  收藏  举报