mysql json解析函数_mysql5.7以下自定义函数解析json

DELIMITER $$

USE `dw`$$

DROP FUNCTION IF EXISTS `fn_Json_getKeyValue`$$

CREATE DEFINER=`data`@`%` FUNCTION `fn_Json_getKeyValue`(

in_JsonArray VARCHAR(4096),#JSON数组字符串

in_Index TINYINT, #JSON对象序号,序号从1开始

in_KeyName VARCHAR(64)#键名

) RETURNS VARCHAR(512) CHARSET utf8

BEGIN

DECLARE vs_return VARCHAR(4096);

DECLARE vs_JsonArray, vs_Json, vs_KeyName VARCHAR(4096);

#declare vs_Json varchar(4096);

DECLARE vi_pos1, vi_pos2 SMALLINT UNSIGNED;

#写监控日志

#insert into dw.t_etl_log(sp_name, title, description)

#values('dw.fn_Json_getKeyValue', '通过Json键名取键值', concat('in_JsonArray=', in_JsonArray));

SET vs_JsonArray = TRIM(in_JsonArray);

SET vs_KeyName = TRIM(in_KeyName);

IF vs_JsonArray = '' OR vs_JsonArray IS NULL

OR vs_KeyName = '' OR vs_KeyName IS NULL

OR in_Index <= 0 OR in_Index IS NULL THEN

SET vs_return = NULL;

ELSE

#去掉方括号

SET vs_JsonArray = REPLACE(REPLACE(vs_JsonArray, '[', ''), ']', '');

#取指定的JSON对象

SET vs_json = SUBSTRING_INDEX(SUBSTRING_INDEX(vs_JsonArray,'}', in_index),'}',-1);

IF vs_json = '' OR vs_json IS NULL THEN

SET vs_return = NULL;

ELSE

SET vs_KeyName = CONCAT('"', vs_KeyName, '":');

SET vi_pos1 = INSTR(vs_json, vs_KeyName);

IF vi_pos1 > 0 THEN

#如果键名存在

SET vi_pos1 = vi_pos1 + CHAR_LENGTH(vs_KeyName);

SET vi_pos2 = LOCATE(',', vs_json, vi_pos1);

IF vi_pos2 = 0 THEN

#最后一个元素没有','分隔符,也没有结束符'}'

SET vi_pos2 = CHAR_LENGTH(vs_json) + 1;

END IF;

SET vs_return = REPLACE(MID(vs_json, vi_pos1, vi_pos2 - vi_pos1), '"', '');

END IF;

END IF;

END IF;

RETURN(vs_return);

END$$

DELIMITER ;

测试: {"old_current_score":"2","new_current_score":"0","old_grade_id":"1","new_grade_id":"1","grade_time":"2016-04-09 00:43:26","grade_upgrade_time":"2017-04-09 00:43:26"}

select fn_Json_getKeyValue(reason,1,'old_grade_id');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值