使用 MySQL JSON 查询筛选嵌套字段的值
在日常开发中,随着项目需求的不断复杂化,许多表字段可能会存储 JSON 格式的数据。例如,我们有一张 site_device 表,其中有一个名为 detail 的字段,保存了设备的详细信息。这些信息存储为 JSON 数据,如下所示:
{"deviceType": "ammeter","techParams": {"name": "202501241556","deviceNo": "202501241556","gatewayNo": "1829047495952388098","ownership": "top","dataReport": "1"},"deviceBrand": "HUAWEI","deviceModel": "test","modelConfigId": "1871021778273325058"
}
我们想要查询出 ownership 为 top 的设备。ownership 字段嵌套在 techParams 中,因此我们需要使用 MySQL 提供的 JSON 函数来实现查询。
1. 理解 JSON 数据的层级结构
在这个例子中,JSON 的结构可以分解为:
deviceType:在 JSON 顶层。techParams:是一个嵌套对象,里面包含了ownership等字段。ownership:目标字段,位于techParams内。
我们需要从 detail 中提取出 techParams.ownership 的值。
2. 使用 MySQL JSON 查询函数
MySQL 提供了一系列函数用于处理 JSON 数据:
JSON_EXTRACT(json_doc, path):从 JSON 中提取值。JSON_UNQUOTE(json_val):去掉 JSON 提取值的引号,返回纯文本。
对于本例来说,我们可以用以下语句来筛选出 ownership 为 top 的记录:
SELECT *
FROM site_device
WHERE JSON_UNQUOTE(JSON_EXTRACT(detail, '$.techParams.ownership')) = 'top';
语法解释
-
JSON_EXTRACT(detail, '$.techParams.ownership')
提取detail中techParams对象内的ownership值。 -
JSON_UNQUOTE(...)
去掉 JSON 提取结果的引号,使其变为普通字符串。 -
WHERE ... = 'top'
筛选出ownership值等于top的记录。
3. 示例数据和运行结果
假设 site_device 表中的数据如下:
| id | detail |
|---|---|
| 1 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 2 | {"deviceType": "ammeter", "techParams": {"ownership": "bottom", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 3 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
运行查询后,结果为:
| id | detail |
|---|---|
| 1 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
| 3 | {"deviceType": "ammeter", "techParams": {"ownership": "top", "dataReport": "1"}, "deviceBrand": "HUAWEI"} |
4. 注意事项
-
JSON 路径表达式
$
JSON 路径表达式$表示 JSON 的根,嵌套字段用.分隔。例如:$.techParams.ownership。 -
性能优化
如果数据量较大,可以通过为 JSON 字段创建虚拟列(Generated Column)并加索引来提升查询性能。ALTER TABLE site_device ADD COLUMN ownership VARCHAR(50) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(detail, '$.techParams.ownership'))) STORED, ADD INDEX idx_ownership (ownership); -
数据规范化
如果 JSON 数据中的字段经常被查询,考虑将这些字段拆分到独立的数据库列中,以提高查询效率。
5. 总结
MySQL 提供了强大的 JSON 查询功能,使得我们可以方便地处理结构化的 JSON 数据。在本文中,我们通过 JSON_EXTRACT 和 JSON_UNQUOTE 函数,成功筛选出了目标字段值为特定值的记录。同时,结合性能优化建议,可以让你的 JSON 查询更高效。希望本文对你有所帮助!
相关文章:
使用 MySQL JSON 查询筛选嵌套字段的值
在日常开发中,随着项目需求的不断复杂化,许多表字段可能会存储 JSON 格式的数据。例如,我们有一张 site_device 表,其中有一个名为 detail 的字段,保存了设备的详细信息。这些信息存储为 JSON 数据,如下所示…...
go-zero学习笔记(一)
基础环境搭建 安装go环境 网上文章比较多,不在赘述,我当时参考的文章是:https://blog.csdn.net/weixin_41287260/article/details/143661816 记得修改go env 中的环境变量, 主要是goproxy 改成七牛云的,这样下载代码库…...
maven、npm、pip、yum官方镜像修改文档
文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂,本文旨在记录各常见镜像官网,及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...
【Docker】私有Docker仓库的搭建
一、准备工作 确保您的系统已安装Docker。如果没有安装,请参考Docker官方文档进行安装。 准备一个用于存储仓库数据的目录,例如/registry_data/。 二、拉取官方registry镜像 首先,我们需要从Docker Hub拉取官方的registry镜像。执行以下命…...
基于MinIO的对象存储增删改查
MinIO是一个高性能的分布式对象存储服务。Python的minio库可操作MinIO,包括创建/列出存储桶、上传/下载/删除文件及列出文件。 查看帮助信息 minio.exe --help minio.exe server --help …...
观察者模式和订阅发布模式的关系
有人把观察者模式等同于发布订阅模式,也有人认为这两种模式存在差异,本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较,发布订阅将发布者和观察者之间解耦。(发布订阅有调度中心处理)...
(2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文
MacOS Redis Desktop Manager中文版下载 大家好,今天给大家带来一款非常实用的 Redis 可视化工具——Redis Desktop Manager(简称 RDM)。相信很多开发者都用过 Redis 数据库,但如果你想要更高效、更方便地管理 Redis 数据&#x…...
Baklib引领内容管理平台新时代优化创作流程与团队协作
内容概要 在迅速变化的数字化时代,内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理,用户能够有效地组织、存储和共享信息,从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台,以其独特的优势和创新功…...
Java实现.env文件读取敏感数据
文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行,提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…...
房屋租赁系统在数字化时代中如何重塑租赁服务与提升市场竞争力
内容概要 在当今快速发展的数字化时代,房屋租赁系统的作用愈发重要。随着市场需求的变化,租赁服务正面临着新的挑战与机遇。房屋租赁系统不仅仅是一个简单的管理工具,更是一个能够提升用户体验和市场竞争力的重要平台。其核心功能包括合同管…...
C++ ——— 学习并使用 priority_queue 类
目录 何为 priority_queue 类 学习并使用 priority_queue 类 实例化一个 priority_queue 类对象 插入数据 遍历堆(默认是大堆) 通过改变实例化的模板参数修改为小堆 何为 priority_queue 类 priority_queue 类为 优先级队列,其本质就是…...
【踩坑】解决Hugging-face下载问题
解决Hugging-face下载问题 问题1:couldnt connect to https://huggingface.co问题2:HTTPSConnectionPool(hostcdn-lfs-us-1.hf-mirror.com, port443)设置hf_transfer加快速度 问题3:requests.exceptions.ChunkedEncodingError: (Connection b…...
DeepSeek 模型全览:探索不同类别的模型
DeepSeek 是近年来备受关注的 AI 研究团队,推出了一系列先进的深度学习模型,涵盖了大语言模型(LLM)、代码生成模型、多模态模型等多个领域。本文将大概介绍 DeepSeek 旗下的不同类别的模型,帮助你更好地理解它们的特点…...
智能家居监控系统数据收集积压优化
亮点:RocketMQ 消息大量积压问题的解决 假设我们正在开发一个智能家居监控系统。该系统从数百万个智能设备(如温度传感器、安全摄像头、烟雾探测器等)收集数据,并通过 RocketMQ 将这些数据传输到后端进行处理和分析。 在某些情况下…...
Three.js实现3D动态心形与粒子背景的数学与代码映射解析
一、效果概述 本文通过Three.js构建了一个具有科技感的3D场景,主要包含两大视觉元素: 动态心形模型:采用数学函数生成基础形状,通过顶点操作实现表面弧度。星空粒子背景:随机分布的粒子群组形成空间层次感。复合动画…...
linux asio网络编程理论及实现
最近在B站看了恋恋风辰大佬的asio网络编程,质量非常高。在本章中将对ASIO异步网络编程的整体及一些实现细节进行完整的梳理,用于复习与分享。大佬的博客:恋恋风辰官方博客 Preactor/Reactor模式 在网络编程中,通常根据事件处理的触…...
多目标优化策略之一:非支配排序
多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…...
电子电气架构 --- 在智能座舱基础上定义人机交互
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
Autosar-Os是怎么运行的?(时间保护)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 1.功能概述 AUTOSAR OS 的四大可定制类型凸显了时间保护(Timing Protection)…...
一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例
论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…...
5分钟带你获取deepseek api并搭建简易问答应用
目录 1、获取api 2、获取base_url和chat_model 3、配置模型参数 方法一:终端中临时将加入 方法二:创建.env文件 4、 配置client 5、利用deepseek大模型实现简易问答 deepseek-v3是截止博文撰写之日,无论是国内还是国际上发布的大模型中…...
算法基础学习——二分查找(附带Java模板)
有单调性的数列一定可以使用二分,没有单调性的题目也可能可以使用二分; (一)整数二分 二分的本质: 在某个整数区间内,存在某种性质使得区间内左半边的数都不满足该性质;而右半边的数都满足该性…...
如何使用formlinker,重构微软表单创建的数字生产力法则?
仅需三步:上传文件-下载文件-导入文件到微软表单 凌晨两点的格式炼狱:被浪费的300万小时人类创造力 剑桥大学的实验室曾捕捉到一组震撼数据:全球教育工作者每年花在调整试题格式上的时间,足够建造3座迪拜哈利法塔。当北京某高校的…...
python-leetcode-路径总和
112. 路径总和 - 力扣(LeetCode) # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:de…...
乐理笔记——DAY01
三分钟音乐社视频地址: 【四川音乐学院作曲硕士】零基础自学音乐学乐理合集-第二季(最终版)/已完结https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&am…...
使用DeepSeek技巧:提升内容创作效率与质量
一、引言 在当今快节奏的数字时代,内容创作的需求不断增加,无论是企业营销、个人博客还是学术研究,高效且高质量的内容生成变得至关重要。DeepSeek作为一款先进的人工智能写作助手,凭借其强大的语言生成能力,为创作者…...
视频编辑系列——Shotcut如何裁切视频黑边并放大画面导出
会议录屏经常出现不满屏的现象(图1),通过本方法可以调整为图2。 图1 图2 打开shotcut,将待裁剪视频导入,将视频拖到时间线。顶部菜单栏点击“滤镜”,新建一个“尺寸、位置与旋转”的滤镜,然后…...
vim操作简要记录
操作容易忘记,记录一下基本使用的 :wq保存退出 :w :q :q! :wq! i I a A 方向键 h左 j下 k上 l右 dd删除方行(这其实是剪切行操作,不过一般用作删除,长按可删除,不过按.执行上一次操作删除更快) .执行上…...
小南每日 AI 资讯 | AI模型扩展的快速增长时代正在放缓 | 25/01/30
AI模型扩展的挑战:随着研究人员发现单纯通过增加规模和计算能力难以获得更大回报,AI模型扩展的快速增长时代正在放缓。 GPT-5开发延迟:OpenAI雄心勃勃的GPT-5项目(代号:Orion)面临着显著的障碍,…...
《DeepSeek 对话实录》
《DeepSeek 对话实录》 你是DeepSeek哪个版本?一、DeepSeek key如何申请1. 访问DeepSeek官网:2. 注册或登录:3. **进入API管理页面**:4. 申请API密钥:5. 提交申请:6. 等待审核:7. 使用API密钥&a…...
