mysql5.7的json列,怎么对数组格式查询
答案:2 悬赏:0 手机版
解决时间 2021-03-01 06:06
- 提问者网友:十年饮冰
- 2021-02-28 09:07
mysql5.7的json列,怎么对数组格式查询
最佳答案
- 五星知识达人网友:平生事
- 2021-02-28 09:37
在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较。
全部回答
- 1楼网友:时间的尘埃
- 2021-02-28 10:34
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');
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯