mysql5.7Json数组解析

个人博客地址 www.tmbcode.com

一、目标需求

mysql5.7支持json极大的方便了我们,但是其中json数组解析一直很麻烦,之前都是先取json数组的长度,然后遍历逐个解析,后来看了一篇博客受到启发,写了这个方法能一次全部解析出来,希望对大家有所启发。

二、建表

新建jsonarray_test表并添加测试数据。

CREATE TABLE jsonarray_test (
  id int(11) NOT NULL AUTO_INCREMENT,
  title varchar(10) NOT NULL COMMENT '名称',
  info json DEFAULT NULL COMMENT 'json数组',
  UNIQUE KEY (title),
  KEY id (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
REPLACE INTO jsonarray_test(title, info) value ('上证19','[{"Symbol": "600030", "ShortName": "中信证券"}, {"Symbol": "601166", "ShortName": "兴业银行"}, {"Symbol": "600887", "ShortName": "伊利股份"},
{"Symbol": "600000", "ShortName": "浦发银行"}, {"Symbol": "601857", "ShortName": "中国石油"}, {"Symbol": "600999", "ShortName": "招商证券"}, {"Symbol": "601006", "ShortName": "大秦铁路"}, 
{"Symbol": "601989", "ShortName": "中国重工"}, {"Symbol": "600104", "ShortName": "上海汽车"}, {"Symbol": "601377", "ShortName": "兴业证券"}, {"Symbol": "601390", "ShortName": "中国中铁"},
{"Symbol": "600050", "ShortName": "中国联通"}, {"Symbol": "600048", "ShortName": "保利地产"}, {"Symbol": "600111", "ShortName": "包钢稀土"}, {"Symbol": "601169", "ShortName": "北京银行"},
{"Symbol": "601800", "ShortName": "中国交建"}, {"Symbol": "600547", "ShortName": "山东黄金"}, {"Symbol": "601668", "ShortName": "中国建筑"}, {"Symbol": "601688", "ShortName": "华泰证券"}]');
REPLACE INTO jsonarray_test(title, info) value ('西藏板块','[{"Symbol": "000752", "ShortName": "西藏发展"}, {"Symbol": "000762", "ShortName": "西藏矿业"}, {"Symbol": "600211", "ShortName": "西藏药业"},
{"Symbol": "600326", "ShortName": "西藏天路"}, {"Symbol": "600338", "ShortName": "西藏珠峰"}, {"Symbol": "600749", "ShortName": "西藏旅游"}, {"Symbol": "600773", "ShortName": "西藏城投"}]');

全表数据

三、写查询存储过程

DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_jsonarray_extract`$$
CREATE PROCEDURE `sp_jsonarray_extract`()
BEGIN
    declare v_i int default 1;
    DROP TABLE IF EXISTS info_incre_table;
    create table info_incre_table (ID int NOT NULL,PRIMARY KEY (ID))ENGINE=MyISAM DEFAULT CHARSET=utf8; -- 自增临时表
    WHILE (v_i<100) DO -- 100代表解json数组的最大长度
        insert into info_incre_table values (v_i); 
        SET v_i=v_i+1;
    END WHILE;
    select a.title,substring_index(substring_index(replace(replace(replace(replace(JSON_EXTRACT(a.info,'$[*].Symbol'),' ',''),'"',''),'[',''),']',''),',',b.ID),',',-1) as symbol from jsonarray_test a
    join info_incre_table b on b.ID <= (length(JSON_EXTRACT(a.info,'$[*].Symbol')) - length(replace(JSON_EXTRACT(a.info,'$[*].Symbol'),',',''))+1) order by a.title;
END$$
DELIMITER ;
  • 执行SQL:call sp_jsonarray_extract();;

    • mysql5.7查询结果(是我们想要的):
      mysql5.7Json数组解析_第1张图片

四、说明总结

  • mysql本身可以这样解析出json数组的所有元素:select title,JSON_EXTRACT(info,’$[*].Symbol’) from jsonarray_test;
    • 结果如下,显然这样的结果并不方便我们进行运算和一系列的操作。
      5.7查询结果
  • 我这个小案例其实是基于上面这个结果,将其分解,利用一张自增临时表,避免了循环遍历,一次把结果解出来,但是效率在数据量较大时不是很高。实测解析出3W条记录用时60S左右。本案例希望能对你的工作或学习有所启发。
    原文地址:http://www.enjoyown.com/mysql5.7-Jsonarray/

你可能感兴趣的:(mysql5.7Json数组解析)