mysql脚本补充数据 json_extract json中有数组 数组动态索引

背景:

有两个表,一个bulletin_info,一个common_infile表

bulletin_info表:id、request_json;其中request_json是一个json串。

common_infile表:id、info_id、file_id、file_key;其中info_id是bulletin_info表的id,file_id、file_key是request_json中解析出的字段。

历史数据中file_key未落库,现将file_key补充完整。

思路:

(1)查出common_infile中file_key为空的数据

(2)根据(1)中common_infile查出的info_id查出bulletin_info对应的request_json数据

(3)解析出后再将查询结果赋值到common_infile中的file_key中

(4)所需要的json数据是在list中,所以需要将数据解析出来

SELECT JSON_EXTRACT(request_json,CONCAT('$.params.commonFileList[',i,'].fileId')) FROM bulletin_info WHERE id = 1;

说明:其中使用了JSON_EXTRACT,CONCAT方法,i是变量,0,1,2...,在取值时要循环取值。

SELECT SUBSTRING_INDEX(SUBSTRING(JSON_EXTRACT(request_json,CONCAT('$.params.commonFileList[',i,'].fileKey')),2),'"',1) FROM bulletin_info WHERE id = 1

说明:fileKey字段是String类型,使用substring方法去掉"" 。

实现:

DROP PROCEDURE IF EXISTS cii_update;
DELIMITER //
CREATE PROCEDURE cii_update()
BEGIN 
	DECLARE	info_id_cii INT;
	DECLARE	info_id_flag INT;
	DECLARE file_id_cii LONG;
	DECLARE id_cii LONG;
	
	DECLARE file_id_info VARCHAR(32);
	DECLARE	file_key_info VARCHAR(128);
	
	DECLARE flag INT DEFAULT 0;
	DECLARE i INT DEFAULT 0;
	
	DECLARE cii_list CURSOR FOR SELECT id, info_id,file_id FROM common_infile WHERE ufms_key IS NULL ;#使用游标
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;#设置flag赋值为1的条件
	OPEN cii_list;#打开游标
	FETCH cii_list INTO id_cii, info_id_cii,file_id_cii;#将游标中的值赋值到id_cii等变量
	SET info_id_flag = info_id_cii;
	WHILE flag <> 1 DO
		SET file_id_info = (SELECT JSON_EXTRACT(request_json,CONCAT('$.params.commonFileList[',i,'].fileId')) FROM bulletin_info WHERE id = info_id_cii);
		SET file_key_info = (SELECT SUBSTRING_INDEX(SUBSTRING(JSON_EXTRACT(request_json,CONCAT('$.params.commonFileList[',i,'].fileKey')),2),'"',1) FROM bulletin_info WHERE id = info_id_cii);
		UPDATE common_infile SET ufms_key = file_key_info WHERE id = id_cii AND file_id = file_id_info AND info_id = info_id_cii;
		FETCH cii_list INTO id_cii, info_id_cii,file_id_cii;#将游标中的值赋值到id_cii等变量
		SET i = i + 1;
		IF info_id_flag != info_id_cii THEN 
		SET info_id_flag = info_id_cii;
		SET i = 0;
		END IF;
	END WHILE;
     CLOSE cii_list;
END
//
CALL cii_update();

参考:

https://www.jianshu.com/p/9a0b4c00f491

https://blog.csdn.net/helloxiaozhe/article/details/86571387

https://blog.csdn.net/ice166/article/details/78830905

https://blog.csdn.net/yangzjchn/article/details/82705565

https://blog.csdn.net/dream_dt/article/details/79152799

https://blog.csdn.net/ghostyusheng/article/details/84260831

https://www.jb51.net/article/164679.htm

https://www.cnblogs.com/baizhanshi/p/9284782.html

https://blog.csdn.net/xiexingshishu/article/details/50191039

https://blog.csdn.net/pjymyself/article/details/81668157

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值