mysql中查询json的技巧

前置工作

CREATE TABLE `mk_task_record` (`task_id` int NOT NULL AUTO_INCREMENT,`task_name` varchar(50) DEFAULT NULL,`result_json` json DEFAULT NULL,`result_str` longtext,`create_time` datetime DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`task_id`),KEY `task_name` (`task_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入数据:
插入带转义符的json:

INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (1, '哈哈1', '{\"age\": 22, \"name\": \"李四\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n  \"name\": \"李四\",\r\n  \"age\": 22,\r\n  \"major\": \"计算机科学\",\r\n  \"university\": \"清华大学\",\r\n  \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');INSERT INTO `test`.`mk_task_record`(`task_id`, `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES (2, '哈哈2', '{\"age\": 22, \"name\": \"张三\", \"major\": \"计算机科学\", \"university\": \"清华大学\", \"is_graduated\": false}', '{\r\n  \"name\": \"张三\",\r\n  \"age\": 22,\r\n  \"major\": \"计算机科学\",\r\n  \"university\": \"清华大学\",\r\n  \"is_graduated\": false\r\n}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');

插入不带转义符的json:

INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈3', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '{"name": "王五", "age": 35, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
INSERT INTO `test`.`mk_task_record`( `task_name`, `result_json`, `result_str`, `create_time`, `update_time`) VALUES ( '哈哈4', '{"name": "赵六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}','{"name": "赵六", "age": 30, "address": {"street": "123 Main St", "city": "Chicago"}}', '2025-01-01 00:13:49', '2025-01-01 00:13:52');
  • result_json是json格式;
  • result_result是longtext格式;

经过实际测试,json、varchar、text类型的json格式都可以使用以下的函数,且效果相同。

一、JSON_EXTRACT 提取指定数据

1.1 提取简单值

SELECT JSON_EXTRACT(result_str,'$.name') from mk_task_record;
SELECT JSON_EXTRACT(result_json,'$.name') from mk_task_record;
  • json类型:
    在这里插入图片描述
  • text类型
    在这里插入图片描述
    结果也带引号;

如何去掉引号呢?
——查看【四、JSON_UNQUOTE 取消双引号】

  • 作条件查询
select *from mk_task_record where json_extract(result_str,'$.name') ='张三';
select *from mk_task_record where json_extract(result_json,'$.name') ='张三';

两条sql返回的都一样:
在这里插入图片描述
https://blog.csdn.net/stxyg/article/details/143718543

二、字段->'$.json属性’进行查询条件,以及数据反显

select result_json->'$.name' from mk_task_record;

在这里插入图片描述
作为查询条件,不用转移双引号。

三、JSON_UNQUOTE 取消双引号

JSON_UNQUOTE() 函数取消双引号引用 JSON 值,并将结果作为字符串返回。

3.1 语法:

JSON_UNQUOTE(json_val)

参数说明:

json_val:必需的。一个字符串。
返回值:

取消双引号引用 JSON 值
返回NULL情况:参数为 NULL。
报错情况:不是有效的 JSON 字符串文本。能够识别下表中的转义字符:
":双引号 "
\b:退格字符
\f:换页符
\n:换行符
\r:回车符
\t:制表符
\:反斜杠
\uXXXX:Unicode 值 XXXX 的 UTF-8 字节

3.2 示例:

SELECT JSON_UNQUOTE(JSON_EXTRACT(result_json,'$.name')) from mk_task_record;

在这里插入图片描述

五、JSON_SEARCH 查找

JSON_SEARCH() 函数返回一个给定字符串在一个 JSON 文档中的路径。

5.1 语法:

JSON_SEARCH(json, one_or_all, search_str)
JSON_SEARCH(json, one_or_all, search_str, escape_char)
JSON_SEARCH(json, one_or_all, search_str, escape_char, path)

参数说明:

  • on:必需的。一个 JSON 文档。
  • one_or_all:必需的。可用值:‘one’, ‘all’。
  • 规则如下:‘one’:返回第一个匹配的路径。‘all’:返回所有匹配的路径。所有的路径会包装在一个数组内返回。
  • search_str:必需的。被搜索的字符串。 您可以在 search_str 参数中使用 % 和 _ 通配符,就像 LIKE 一样:% 匹配任意数量的任意字符。_ 匹配一个任意字符。
  • escape_char:可选的。 如果 search_str 中包含 % 和 _,需要在他们之前添加转移字符。默认是 \。
  • path:可选的。只能在此路径下进行搜索。

返回值:一个路径字符串或者由多个路径组成的数组。返回 NULL情况:未搜索到指定的字符串。JSON 文档中不存在指定的 path。任意一个参数为 NULL。

报错情况:json 不是有效的 JSON 文档。path 不是有效的路径表达式。

5.2 示例:

select *from mk_task_record where  JSON_SEARCH(result_json,'one','张三');

六、JSON_SET 插入或更新数据

JSON_SET() 函数在一个 JSON 文档中插入或更新数据并返回新的 JSON 文档。它相当于是 JSON_INSERT() 和 JSON_REPLACE() 的组合。

6.1 语法:

JSON_SET(json, path, value[, path2, value2] ...)

参数说明:

  • json:必需的。被修改的 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
  • value:必需的。要设置的数据。

插入或更新数据并返回新的 JSON 文档。规则如下:

  • 存在路径:更新。
  • 不存在路径:添加。
  • 若value 为字符串:直接插入。
  • 返回 NULL情况:JSON 文档或者路径为 NULL。

报错情况:json 不是有效的 JSON 文档。
path 不是有效的路径表达式或者其中包含 * 或 **。

6.2 示例:

UPDATE mk_task_record SET result_str = JSON_SET(result_str, '$.name', '王麻子', '$.age', '36')  where task_id =1;

在这里插入图片描述

七、JSON_CONTAINS 判断是否包含

JSON_CONTAINS() 函数检查一个 JSON 文档中是否包含另一个 JSON 文档。

7.1 语法:

JSON_CONTAINS(target_json, candidate_json)
JSON_CONTAINS(target_json, candidate_json, path)

参数说明:

  • target_json必需的。一个 JSON 文档。
  • candidate_json:必需的。被包含的 JSON 文档。
  • path:可选的。一个路径表达式。
  • 返回值:

包含:返回1。
不包含:返回0。
返回 NULL情况:JSON 文档中不存在指定的路径。
任意一个参数为 NULL。

报错情况:
json 不是有效的 JSON 文档。path 不是有效的路径表达式。

示例:

SELECT * FROM mk_task_record WHERE JSON_CONTAINS(result_json, '"张三"','$.name');

在这里插入图片描述
注意:"张三"有双引号一定加,否则报错:
在这里插入图片描述

八、JSON_REMOVE 删除指定数据

JSON_REMOVE() 函数从一个 JSON 文档中删除由路径指定的数据并返回修改后的 JSON 文档。

8.1 语法:

JSON_REMOVE(json, path[, path] ...)

参数说明:

  • json:必需的。一个 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。

返回值:删除后的JSON文档。

8.2 示例:

select JSON_REMOVE(result_str,'$.major') from mk_task_record where task_id =1;

九、JSON_REPLACE 替换数据

JSON_REPLACE() 函数在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档

9.1 语法:

JSON_REPLACE(json, path, value[, path2, value2] ...)

参数说明:

  • json:必需的。被修改的 JSON 文档。
  • path:必需的。一个有效的路径表达式,它不能包含 * 或 **。
  • value:必需的。新的数据。
  • 返回值:替换后的JSON文档。回 NULL情况:JSON 文档或者路径为 NULL。

报错情况:
json 不是有效的 JSON 文档。path 不是有效的路径表达式或者其中包含 * 或 **。

9.2 示例:

select JSON_REPLACE(result_str,'$.university','复旦大学') from mk_task_record where task_id =1;

在这里插入图片描述

拓展:
https://www.qianduange.cn/article/15824.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/504234.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis的合并、相交、融合、裁剪、联合、标识操作的区别和使用

1、相交 需要输入两个面要素,最终得到的是两个输入面要素相交部分的结果面要素。 2、合并 合并能将两个单独存放的两个要素类的内容,汇集到一个要素类里面。 3、融合 融合能将一个要素类内的所有元素融合成一个整体。 4、裁剪 裁剪需要输入两个面要…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络: 静态配置路由动态路由协议 在本文,我们将学习关于静态路由的各种概念,例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

C++ 复习总结记录六

C 复习总结记录六 模板初阶主要内容 1、泛型编程 2、函数模板 3、类模板 4、STL 简介 一 泛型编程 如何实现一个通用的交换函数 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right…

Leecode刷题C语言之字符串中最大的3位相同数字

执行结果:通过 执行用时和内存消耗如下&#xff1a; char* largestGoodInteger(char* num) {int n strlen(num);char* res NULL;for (int i 0; i < n - 2; i) {if (num[i] num[i 1] && num[i 1] num[i 2]) {if (res NULL || strncmp(&num[i], res, 3)…

《繁星路》V1.8.3(Build16632266)官方中文学习版

《繁星路》官方中文版https://pan.xunlei.com/s/VODae2_2Z3QyMF02I5y321uHA1?pwdqgsh# 作为一款星际模拟游戏&#xff0c;完美融合了硬科幻元素与基地建设玩法&#xff0c;体验改造行星的恢弘与壮阔。化身人工意识AMI&#xff0c;遵照基本指示推进火星改造的各项工作&#xf…

《Spring Framework实战》9:4.1.4.依赖注入

欢迎观看《Spring Framework实战》视频教程 典型的企业应用程序不是由单个对象&#xff08;或Spring术语中的bean&#xff09;组成。即使是最简单的应用程序也有几个对象协同工作&#xff0c;以呈现最终用户所认为的连贯应用程序。下一节将解释如何从定义多个独立的bean定义到一…

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值&#xff0c;并显示在 LCD1602 上&#xff1b; 2. 按键修改阈值&#xff0c;并显示在 LCD1602 上&#xff1b; 3. 烟雾值超过阈值时&#xff0c;蜂鸣器长响&#xff0c;风扇打开&#xff1b;烟雾值小于阈值时&#xff0c;蜂鸣器不响…

云安全博客阅读(三)

WAF强固之盾&#xff1a;机器学习赋能下的语义分析 WAF 中&#xff0c;传统的基于正则的检测方法依赖正则的运营更新&#xff0c;以不断防护新的攻击方法&#xff1b; 主要流程为&#xff1a;HTTP包 -> payload解码 -> 正则匹配 但是&#xff0c;攻击者可以通过修改攻…

个人博客搭建(二)—Typora+PicGo+OSS

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; 做个超努力的小奚-CSDN博客 一、前言 博客搭建完一直没有更新&#xff0c;因为WordPress自带的文档编辑器不方便&#xff0c;以前用CSDN写作的时候&#xff0c;习惯了Typora。最近对比了…

spring boot 集成 knife4j

1、knife4j介绍以及环境介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍!其底层是对Springfox的封装&#xff0c;使用方式也和Springfox一致&#xff0c;只是对接口…

案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践

PART01 项目背景 01客户简介案例客户是一家创立20多年的香港某多元化综合金融企业&#xff0c;其业务范围涵盖证券、期货、资产管理、财富管理等&#xff0c;凭借广泛的业务网络和多元化的金融服务产品&#xff0c;在市场中拥有显著的影响力。02痛点分析随着业务版图的持续拓展…

KCP解读:C#库类图

本文是系列文章中的一篇&#xff0c;内容由浅到深进行剖析&#xff0c;为了方便理解建议按顺序一一阅读。 KCP技术原理 KCP解读&#xff1a;基础消息收发 KCP解读&#xff1a;重传机制 KCP解读&#xff1a;滑动窗口 KCP解读&#xff1a;拥塞控制 本系列的源码基于https://gith…

Nginx:Stream模块

什么是 Stream 模块? Stream 模块 是 Nginx 的一个核心模块,专为处理非 HTTP 协议的流量(TCP 和 UDP 流量)而设计。它可以用来负载均衡和代理 TCP 或 UDP 连接,适用于多种应用场景,如: 数据库集群(MySQL、PostgreSQL 等)邮件服务器(SMTP、IMAP、POP3)游戏服务器VoI…

Profinet转EtherNet/IP网关连接AB PLC的应用案例

某大型制造企业的生产车间同时采用了西门子 S7 - 1500 PLC 作为核心控制系统的一部分&#xff0c;负责主要生产流程的控制与数据处理&#xff1b;而在特定生产环节&#xff0c;由于历史设备遗留或工艺配套需求&#xff0c;存在使用 AB PLC 的情况。这就导致了在整个自动化生产系…

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务&#xff0c;一开始是经纬度显示的。 2、右键地图&#xff0c;选择需要调整的投影坐标&#xff0c;这里选择坐标如下&#xff1a; 3、点击确定后&#xff0c;就可以调整成米单位的了。 4、切换后结果如下&#xff1a; 如有需要&#xff0c;可调整成…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…

Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本

目录 ledeWRT介绍固件编译下载代码修改feed源更新并安装编译第三方软件包制作用于eMMC烧写的rootfs基于lede发行版验证烧写rk3568.img, LEDE wrt启动成功refhttps://blog.csdn.net/zc21463071/article/details/106751361介绍rk3568平台下, lede 大神版 openwrt固件的下载、编译…

【linux系统之redis6】redisTemplate的使用方法

新版本的application.yml配置文件 spring:data:redis:host: 192.168.1.102port: 6379lettuce:pool:max-active: 8min-idle: 1max-idle: 0max-wait: 100redisTemplate使用方法 <dependencies><dependency><groupId>org.springframework.boot</groupId>…

【算法】字符串算法技巧系列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a;字符串相关算法技巧 1&#xff1a;字符串转数组 2&#xff1a;子字符串 3&#xff…