mysql存储过程来取出json类型中的值

mysql的版本要是5.7及以上才行,因为在5.7才支持json类型。

  1. *技术不是很好,现在就是写一些存储过程,前段时间需要做一个权限的划分之类的功能。类似A类用户可以查看其下的B类用户工作进展。然后最初想的是直接一对多的映射,将A的用户表中的ID和其对应的B类用户的ID集合一 一对应,这样就能实现简单的一对多。因为mysql有set类型,就想使用set字段来将B类用户的ID存入,然后遍历出来,奈何找了很多教程和文档发现取不出来。后来想到既然是ID组合,能不能用数组来实现,然后json刚好有json数组和json对象类型两种,话不多说来试一下吧。
    DROP TABLE IF EXISTS json ;
    CREATE TABLE json (
    ID int(11) NOT NULL,
    IDJSON json NULL COMMENT ‘人员ID,json’,
    PRIMARY KEY ( ID ) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    可以看到这张表是没有主键的 因为我们这张表就是来存储user表里的ID字段和ID字段组成的json数组的,目标就是遍历出ID字段对应的IDJSON字段中的值

向表里插入几条记录
INSERT INTO json VALUES (17, ‘[25, 31, 33, 37, 69, 71, 73, 75]’);
INSERT INTO json VALUES (21, ‘[25, 31, 33, 37, 39, 67, 69, 71, 73, 75]’);
INSERT INTO json VALUES (175, ‘[25, 31, 33, 37, 39, 67, 69, 71, 75]’);
可以看到IDJSON字段插入时是一个json数组形式字符串,如果不是json类型就会报错。
最终表里的数据是这样的:
在这里插入图片描述
然后我们开始写存储过程来遍历出IDJSON字段中的值

CREATE DEFINER= root @ % PROCEDURE proc_json_array (
i_userid int(11)
)
BEGIN
declare i int default 0;
declare v_length int(11);-- 接收数组的长度
declare v_a varchar(100);-- 接收数组的角标的变量
select json_length(IDJSON) into v_length from json where ID=i_userid;
DROP temporary TABLE IF EXISTS tmp_t;
create temporary table if not exists tmp_t(-- 创建临时表保存查询的结果集中的需要的数据
USERID int(11)
);
while i<v_length
do
set v_a=concat("’$[",i,"]’");
set @sql=concat(‘insert into tmp_t(USERID) select IDJSON->’,v_a ,’ from json where ID=’,i_userid);
prepare s from @sql;
execute s;
set i=i+1;
end while;
select USERID from tmp_t;
END

可以看到存储过程需要输入一个int类型参数i_userid 就是表中的ID字段的值。
然后declare声明了一个int型的变量i,它是用来保存循环的次数,然后定义了v_length变量来保存ID字段对应的IDJOSN字段中json数组的长度,接收数组下角标的变量就不说了,然后创建一个只有一个字段USERID的临时表tmp_t.用来将我们遍历出来的值插入进临时表,然后遍历完成后再一次性查出来,这样就只有一个结果集,下面的循环体中从数组的为0 的角标开始取值,因为用到变量所以就想到concat构造动态sql每次取出一个值就执行一次插入临时表的操作,遍历完成然后再查临时表的数据字段即可。 执行存储过程,输入参数17,得到的结果集为,需要注意的是操作j’son类型时的注意点,set v_a=concat("’ [ " , i , " ] " ) ; [i]'这样的形式,可以使用转义字符,@sql的拼接也要注意单引号处的操作。
在这里插入图片描述
这里只是对单层的json数组进行遍历,当然如果是多个字段类型的json如[{“A”:“VAL”,“B”:“VAL”},{“A”:“VAL”,“B”:“VAL”}]时只需在创建临时表时多一个字段,然后在值时参考mysql文档中json字段的用法就能取出。本人在使用时只是用来满足用户一对多的关系,比如A类用户的user表ID主键为1,user表中的B类用户ID为7,8,9,10,11,12需要和ID为1的用户关联表明他们之间的从属关系,那么只需在json表新增条记录ID为1,IDJSON值为[7, 8, 9, 10, 11, 12]即可 然后执行上述存储过程,输入1,得到单列多条的7,8,9,10,11,12结果集,如果需要查看这些用户的信息可以在存储过程的end之前加如下语句
select user表字段1,user表字段2… from user where ID IN(select USERID from tmp_t);
这样在第二个结果集就得到了这些用户的信息。
result1
在这里插入图片描述

result2

mysql的版本要是5.7及以上才行,因为在5.7才支持json类型。

一、今天在开发 遇到 mysql 遍历 json 数据的需求,查了些资料,然后特此记录, 二、在 mysql 5.7 是有一个方法用来取 json 数据的, JSON _EXTRACT( JSON .Val,key),详细代码如下 三、代码如下: CREATE DEFINER=`root`@`localhost` PROCEDURE `fun_sys_user_local_mobileReg`(pUserId int... 一、今天在开发 遇到 mysql 遍历 json 数据的需求,查了些资料,然后特此记录,二、在 mysql 5.7 是有一个方法用来取 json 数据的, JSON _EXTRACT( JSON .Val,key),详细代码如下三、代码如下:CREATE DEFINER=`root`@`localhost` PROCEDURE `fun_sys_user_local_mobileReg`(pUserId int,pIP... 一、目标需求 mysql 5.7支持 json 极大的方便了我们,但是其 json 数组 解析一直很麻烦,之前都是先取 json 数组 的长度,然后 遍历 逐个解析,后来看了一篇博客受到启发,写了这个方法能一次全部解析出来,希望对大家有所启发。 新建 json array_test表并添加测试数据。 CREATE TABLE json array_test ( id int(11) NOT NULL AU... 一、今天在开发 遇到 mysql 遍历 json 数据的需求,查了些资料,然后特此记录,二、在 mysql 5.7 是有一个方法用来取 json 数据的, JSON _EXTRACT( JSON .Val,key),详细代码如下三、代码如下:CREATE DEFINER=`root`@`localhost` PROCEDURE `fun_sys_user_local_mobileReg`(pUserId int,pIP... oradb.core4-fcr.user.ebay-users [{"doc": "Rheos header - This is mandatory for every schema in Rheos", "name": "rheosHeader", "type": {"name": "RheosHeader", "type": "record", "fields": [{"name": "eventCreateTimestamp", "type" Mysql 5.7版本以后新增的功能, Mysql 提供了一个原生的 Json 类型, Json 将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(documentelements)的内部二进制(internalbinary)格式。在 Json 列插入或者更新的时候将会自动验证 Json 文本,未通过验证的文本将产生一个错误信息创建表t_user登录方式字段 使用 json 格式,分为phone,wechat,qq,email,zhifubao等等。...