新特性解读 | 数组范围遍历功能

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析) 本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。 阅读详情

作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


大家都知道,MySQL 从 5.7 开始,增加了新的数据类型:JSON。

JSON 类型的出现,弥补了 MySQL 长期以来相比其他关系型数据库的非标准化特性略势,比如可以用 JSON 来实现类似字典、数组等类型。以及之后大量针对 JSON 类型字串的相关遍历方法与函数。

比如对数组来说,简单的遍历路径为 “[数组小标]"或者"[数组小标]" 或者 "[数组小标]"或者"[*]” 来一次性遍历所有元素。MySQL 8.0 又新增了对于数组元素的范围遍历,比如 “$[m to n]”,表示遍历下标为 m 到 n 的元素。

举个例子,以下 JSON 字串(随便找张表 explain format=json 的结果):

# javascript
set @json_str1 = '{
  "query_block": {
    "table": {
      "filtered": "100.00",
      "cost_info": {
        "eval_cost": "898504.10",
        "read_cost": "17457.25",
        "prefix_cost": "915961.35",
        "data_read_per_join": "137M"
      },
      "table_name": "t1",
      "access_type": "ALL",
      "used_columns": [
        "id",
        "r1",
        "r2",
        "r3",
        "r4",
        "r5",
        "r6",
        "r7",
        "r8"
      ],
      "rows_examined_per_scan": 8985041,
      "rows_produced_per_join": 8985041
    },
    "cost_info": {
      "query_cost": "915961.35"
    },
    "select_id": 1
  }
}';

其中 key 为 used_columns 对应的值就是一个数组,现在我把这个数据遍历出来,并且生成以下结果:

# javascript
["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"]

["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7"]

["id", "r1", "r2", "r3", "r4", "r5", "r6"]

["id", "r1", "r2", "r3", "r4", "r5"]

["id", "r1", "r2", "r3", "r4"]

["id", "r1", "r2", "r3"]

["id", "r1", "r2"]

["id", "r1"]

["id"]

先把这个键对应的值赋给一个变量:

mysql> select json_extract(@json_str1,"$.query_block.table.used_columns") into @json_array1;
Query OK, 1 row affected (0.00 sec)

接下来写个传统 PATH 遍历数据的存储过程来实现以上这个结果:

DELIMITER $$

USE `ytt`$$

DROP PROCEDURE IF EXISTS `sp_print_json_array_sample`$$

CREATE DEFINER=`root`@`%` PROCEDURE `sp_print_json_array_sample`(
    IN f_str1 JSON
    )
BEGIN
    DECLARE v_tmp_length TINYINT UNSIGNED DEFAULT 0;
    DECLARE i TINYINT UNSIGNED DEFAULT 0;

    SET v_tmp_length = JSON_LENGTH(f_str1);
    SET i = v_tmp_length;
    SET @v_tmp_result = f_str1;

    DROP TEMPORARY TABLE IF EXISTS tmp;
    CREATE TEMPORARY TABLE IF NOT EXISTS tmp(str1 JSON);

    WHILE i > 0
    DO
      SET i = i - 1;
      SET @stmt = CONCAT('select json_remove(@v_tmp_result,"$[',i,']") into @v_tmp_result');
      INSERT INTO tmp VALUES (@v_tmp_result);
      PREPARE s1 FROM @stmt;
      EXECUTE s1;
      END WHILE;
      DROP PREPARE s1;

      SET @v_stmt = NULL;
      SET @v_tmp_result = NULL;
      SELECT * FROM tmp;
END$$

DELIMITER ;

调用下这个存储过程:

mysql> call sp_print_json_array_sample(@json_array1);
+--------------------------------------------------------+
| str1                                                   |
+--------------------------------------------------------+
| ["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"] |
| ["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7"]       |
| ["id", "r1", "r2", "r3", "r4", "r5", "r6"]             |
| ["id", "r1", "r2", "r3", "r4", "r5"]                   |
| ["id", "r1", "r2", "r3", "r4"]                         |
| ["id", "r1", "r2", "r3"]                               |
| ["id", "r1", "r2"]                                     |
| ["id", "r1"]                                           |
| ["id"]                                                 |
+--------------------------------------------------------+
9 rows in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

那在 MySQL 8.0 下,可以直接把这个存储过程给优化掉,简化的写法如下:

DELIMITER $$

USE `ytt`$$

DROP PROCEDURE IF EXISTS `sp_print_json_array_sample`$$

CREATE DEFINER=`root`@`%` PROCEDURE `sp_print_json_array_sample`(
    IN f_str1 JSON
    )
BEGIN
    DECLARE v_tmp_length TINYINT UNSIGNED DEFAULT 0;
    DECLARE i TINYINT UNSIGNED DEFAULT 0;

    SET v_tmp_length = JSON_LENGTH(f_str1);
    SET i = v_tmp_length;
    DROP TEMPORARY TABLE IF EXISTS tmp;
    CREATE TEMPORARY TABLE IF NOT EXISTS tmp(str1 JSON);

    WHILE i > 0
    DO
      SET i = i - 1;
      SET @stmt = CONCAT(' insert into tmp select json_extract(''',f_str1,''','' $[ 0 to     ',i,']'') ');
      PREPARE s1 FROM @stmt;
      EXECUTE s1;
    END WHILE;

    DROP PREPARE s1;
    SET @v_stmt = NULL;

    SELECT str1 AS array_result FROM tmp;

END$$

DELIMITER ;

调用结果一样:

mysql> call sp_print_json_array_sample(@json_array1);
+--------------------------------------------------------+
| array_result                                           |
+--------------------------------------------------------+
| ["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8"] |
| ["id", "r1", "r2", "r3", "r4", "r5", "r6", "r7"]       |
| ["id", "r1", "r2", "r3", "r4", "r5", "r6"]             |
| ["id", "r1", "r2", "r3", "r4", "r5"]                   |
| ["id", "r1", "r2", "r3", "r4"]                         |
| ["id", "r1", "r2", "r3"]                               |
| ["id", "r1", "r2"]                                     |
| ["id", "r1"]                                           |
| ["id"]                                                 |
+--------------------------------------------------------+
9 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

其中路径 “$[m to n]” , n 也可以是保留字 last,代表最后一个下标,比如:

mysql> select json_extract(@json_array1,'$[0 to last-7]') as result;
+--------------+
| result       |
+--------------+
| ["id", "r1"] |
+--------------+
1 row in set (0.00 sec)

总结

这里简单介绍了 MySQL 8.0 对于 JSON 数组的范围遍历功能,希望大家在开发过程中更加得心应手。

别再只怪贴片厂了!从MLCC内部裂纹,看懂物料质量与工艺应力的博弈 本文深入分析了MLCC内部裂纹的失效原因,提供了从裂纹形态学到生产全流程的失效风险地图的完整分析框架。通过实战案例和检测技术组合,帮助工程师精准锁定MLCC失效背后的真凶,优化物料质量和工艺应力管理。 阅读详情

相关推荐

IGV实战指南:从数据导入到Peak可视化的全流程解析

本文提供了一份IGV实战指南,详细解析了从数据导入到Peak可视化的全流程。内容包括软件安装、参考基因组加载、测序数据处理、信号调整以及如何精准定位和可视化Peak区域,并分享了导出出版级矢量图的高级技巧,帮助用户高效完成基因组数据可视化分析。

weixin_29212867的博客 147

【C++】auto与范围遍历

【C++】auto与范围遍历

BebopPrimer的博客 2163

【暂时完结】Prescan学习笔记

Prescan学习记录1. Prescan基础知识1.1 Conventions·坐标1.2 Road segment·道路片段1.2.1 让一个路段连接其他两个路段1.2.2 配置车道线1.2.3 Road marking·道路标志1.3 Trajectory·轨迹1.3.1 建立一个Path·路径1.3.2 配置Speedprofile1.3.3 Synchronization of Trajectories·轨迹同步1.3.4 Multiple trajectories · 多轨迹分配 1. Pres

dreautumn的博客 1万+

C++基础——auto关键字和范围for遍历

C++auto关键字和范围for遍历

weixin_69283129的博客 3553

FPGA以太网通信实战(一):实现MDIO接口驱动,掌控PHY芯片的钥匙

本文介绍了以太网通信技术及其核心组件。首先概述了以太网的发展历程,从标准以太网(10Mbps)到万兆以太网(10Gbps)的技术演进。重点分析了以太网接口的两大核心部件:MAC控制器负责数据链路层协议处理,PHY芯片负责物理信号转换和连接管理。文章详细解读了MDIO接口规范,包括帧格式和读写时序,并以YT8531 PHY芯片为例,介绍了其寄存器配置方法。最后设计了一个FPGA实现方案,通过MDIO接口完成PHY芯片的软复位和状态监测功能,并利用LED指示灯实时显示网络连接速率。

weixin_64402689的博客 1660

LaTeX小白必看:TeX Live+TeXstudio保姆级安装教程(附清华镜像加速)

本文为LaTeX新手提供了一份详尽的TeX Live和TeXstudio安装指南。通过清华大学镜像站实现高速下载,并详细讲解了从下载、定制化安装到配置优化的每一步,帮助用户快速搭建稳定高效的本地LaTeX写作环境,轻松处理学术文档排版。

weixin_29214559的博客 413

C++容器的范围遍历

C++容器范围遍历是一种简洁而直观的语法,用于遍历容器中的元素。它使用了C++11引入的范围-based for 循环语法,也称为范围遍历或区间遍历。

wfs66的博客 452

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

windows下误删数据库恢复(MySQL8.0)

windows下误删数据库恢复

Anlger的博客 2730

【电脑技巧】CPU正常运行时间过长,怎么解决?

目录 问题描述 解决方案 1、问题描述 不少同志都遇到过这样的问题:按【Ctrl + alt + delete】打开任务管理器,切到“性能”选项卡下,发现自己电脑的CPU正常运行时间竟然为好几十天!很多人担心这会不会影响电脑的寿命?于是很想知道这是怎么回事,以及如何解决这个问题。 我在此解答一下,这是由于你的电脑开启了“快速启动”这一选项的缘故,只要把这一选项关闭,问题就解决了。 2、解决方案 怎样关闭“快速启动”呢?按照如下的步骤来即可。 顺便声明一下,笔者的电脑配置: 使用电脑:联想Yoga 14

橄榄树下的孩子 3万+

手把手教你学Simulink--基于多能源系统协同控制的复杂场景实例:氢燃料电池+锂电池混合动力电动汽车能量管理仿真

本文介绍了基于Simulink的氢燃料电池与锂电池混合动力电动汽车能量管理系统的建模与仿真方法。系统包含驾驶循环输入、燃料电池子系统、锂电池子系统、能量管理、电机驱动等模块,通过协同控制优化能源分配。详细说明了从模型创建到各子系统设置的7个步骤,并提供了MATLAB代码示例。该仿真可评估不同工况下的系统响应速度、能量利用效率和电池寿命等性能指标,为混合动力汽车的能量管理策略设计和优化提供参考。

MHD0815的博客 238

【C++】遍历的三种常用方式:迭代器、范围for、下标+[]

C++简单遍历数组的三种方式:迭代器、范围for、下标+[]

weixin_57163217的博客 1236

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 243

mysql 数组_新特性解读 | 数组范围遍历功能

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。大家...

weixin_39551611的博客 370

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数组遍历_新特性解读 | 数组范围遍历功能

作者:杨涛涛资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。大家...

weixin_39762464的博客 79

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JDK 24 来啦!解读一下新特性!

真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和一样。下一个长期支持版是,预计今年 9 月份发布。Java 24 带来的新特性还是蛮多的,一共 24 个。Java 23 和 Java 23 都只有 12 个,Java 24的新特性相当于这两次的总和了。因此,这个版本还是非常有必要了解一下的。

JavaGuide 2068

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JDK 24新特性解读

ava 24 带来的新特性还是蛮多的,一共 24 个。Java 23 和 Java 23 都只有 12 个,Java 24的新特性相当于这两次的总和了。因此,这个版本还是非常有必要了解一下的。下图是从 JDK8 到 JDK 24 每个版本的更新带来的新特性数量和更新时间:我在昨天晚上详细看了一下 Java 24 的详细更新,并对其中比较重要的新特性做了详细的解读,希望对你有帮助!

x_9876554321_的博客 1229

JDK 24 发布,新特性解读!

真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和一样。下一个长期支持版是,预计今年 9 月份发布。Java 24 带来的新特性还是蛮多的,一共 24 个。Java 23 和 Java 23 都只有 12 个,Java 24的新特性相当于这两次的总和了。因此,这个版本还是非常有必要了解一下的。

weixin_30733115的博客 256

C++11新特性解读

总结:C++11标准为C++语言带来了许多强大的新特性,包括列表初始化、自动类型推导、范围for循环、lambda表达式以及可变参数模板等。随着C++11标准的发布,C++语言迎来了许多引人注目的新特性。这些新特性不仅增强了C++的功能和灵活性,还提高了开发者的编程效率和代码的可读性。本文将详细解读C++11中的一些重要新特性,包括列表初始化、自动类型推导、范围for循环、lambda表达式以及可变参数模板等。可变参数模板的引入极大地提高了C++的泛型编程能力,使得我们可以编写更加灵活和通用的代码。

AmosKelvin的博客 299
上一篇: 第06期:Prometheus 存储
下一篇: 技术分享 | MySQL 内存管理初探
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值