芳机灵的三某人 2018-03-16 07:00 采纳率: 100%
浏览 4368
已采纳

如何解决5.5版本mysql下,由json串组成的数组取值问题。

问题详细场景如下:A表中有字段a,a字段类型如[{"PROCESS_ID":"e03e4049-aea2-435e-b5a0-1e808cd5b4ad","PROCESS_VALUE":1.0,"STANDARD_MH":2.00,"IsSelected":true},{"PROCESS_ID":"44742e69-5cb3-4444-a1f9-a833ee945a2d","PROCESS_VALUE":1.0,"STANDARD_MH":1.50,"IsSelected":true},{"PROCESS_ID":"a5c7b02e-2667-4704-9c50-a768f8788a3f","PROCESS_VALUE":1.0,"STANDARD_MH":1.50,"IsSelected":true},{"PROCESS_ID":"7270b3ba-c769-4813-837a-74d550459b86","PROCESS_VALUE":1.0,"STANDARD_MH":3.00,"IsSelected":true},{"PROCESS_ID":"986bac02-0765-40ae-a4fa-173911dffc8b","PROCESS_VALUE":1.0,"STANDARD_MH":1.60,"IsSelected":true},{"PROCESS_ID":"36619e86-5e38-45a5-8167-33bbb6244508","PROCESS_VALUE":1.0,"STANDARD_MH":2.00,"IsSelected":true}]
a字段由若干个json串组成,数量未知。现要计算得到sum(PROCESS_VALUE*STANDARD_MH),自己捣鼓了很久了,没有解决,求大神帮忙解决下,最好能写个自定义函数,多谢!

  • 写回答

10条回答 默认 最新

  • 红帽01 2018-03-16 14:00
    关注

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 马提斯亚胡 2018-03-16 07:50
    关注

    你这种数据结构就不应该这样存,可以重新建立张表专门存json数据,和A表的记录关联起来。

    评论
  • 芳机灵的三某人 2018-03-16 08:54
    关注

    这个数据结构不是我能决定的,大神们有没有什么解决方法

    评论
  • 天地炫舞 2018-03-16 08:55
    关注

    可以尝试使用mysql5.7版本了,它具有json格式的数据,效率很快,我们正在考虑mysql升级,博主也可以考虑下

    评论
  • 芳机灵的三某人 2018-03-16 08:58
    关注

    create FUNCTION fn_json_array (proc_json_array varchar(255),proc_key varchar(255),MH_key varchar(255))
    BEGIN
    #声明变量
    DECLARE ANS VARCHAR(255) DEFAULT 0;
    DECLARE key1 VARCHAR(255);
    DECLARE key2 VARCHAR(255);

    #判断传入的参数是否为空
    IF(length(proc_json_array) = 0) THEN
    SET ANS = 0;
    ELSE
    SET key1 = substr(proc_json_array,2,length(proc_json_array)-2);

    #循环计算结果
    REPEAT
    SET key2 = substr(key1,1,locate('}',key1));
    SET key1 = substr(key1,(length(key2)+2),(length(key1)-length(key2)));
    IF(length(key2)=110)
    THEN
    SET ANS = ANS + substr(key2,70,3)*substr(key2,88,4);
    ELSE
    SET ANS = 0;
    END IF;
    UNTIL length(key1) = 0;
    END REPEAT;
    END IF;

    RETURN ANS;
    END

    以上是我的逻辑,应该是可以解出来的,由于基本没写过自定义函数,对于这个的语法不了解,大牛们帮忙看看这个语法有没有问题,多谢了!

    评论
  • 红帽01 2018-03-16 13:56
    关注

    DELIMITER $$

    CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    FUNCTION simpleFun2 (jsontext TEXT,strValue VARCHAR(40),strMh VARCHAR(40)) RETURNS DECIMAL(12,2)
    BEGIN
    DECLARE key1 TEXT;
    DECLARE key2 TEXT;
    DECLARE strIndex INT;
    DECLARE decValue DECIMAL(12,2);
    DECLARE decMh DECIMAL(12,2);
    DECLARE decSum DECIMAL(12,2);

    SET strIndex = LOCATE(strValue, jsontext);
    SET key1 = SUBSTR(jsontext, strIndex + LENGTH(strValue)+2);     
    
    SET strIndex = LOCATE(',', key1);
    SET key2 = SUBSTR(key1, 1,strIndex-1);      
    
    SET decValue = CONVERT (key2 , DECIMAL(12,2)) ;
    INSERT INTO ecx_test1 (text1) VALUES(decValue); 
    
    SET strIndex = LOCATE(strMh, key1);
    SET key1 = SUBSTR(key1, strIndex + LENGTH(strMh)+2);
    
    SET strIndex = LOCATE(',', key1);
    SET key2 = SUBSTR(key1, 1,strIndex-1);
    
    INSERT INTO ecx_test1 (text1) VALUES(key2);
    SET decMh = CONVERT (key2 , DECIMAL(12,2)) ;    
    
    SET decSum = decValue * decMh;  
    

    RETURN decSum;
    END $$

    DELIMITER ;

    评论
  • 红帽01 2018-03-16 13:57
    关注

    SELECT simpleFun(TEXT,'PROCESS_VALUE','STANDARD_MH') FROM ecx_test

    评论
  • 红帽01 2018-03-16 14:00
    关注

    图片说明

    评论
  • 红帽01 2018-03-16 14:00
    关注

    图片说明

    评论
  • 芳机灵的三某人 2018-03-19 04:26
    关注

    图片说明

    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 求苹果推信imessage批量推信技术
  • ¥15 ubuntu 22.04 系统盘空间不足。隐藏的docker空间占用?(相关搜索:移动硬盘|管理系统)
  • ¥15 利用加权最小二乘法求亚马逊各类商品的价格指标?怎么求?
  • ¥15 c++ word自动化,为什么可用接口是空的?
  • ¥15 Matlab计算100000*100000的矩阵运算问题:
  • ¥50 VB6.0如何识别粘连的不规则的数字图片验证码
  • ¥16 需要完整的这份订单所有的代码,可以加钱
  • ¥15 Stata数据分析请教
  • ¥15 请教如何为VS2022搭建 Debug|win32的openCV环境?
  • ¥15 关于#c++#的问题:c++如何使用websocketpp实现websocket接口调用,求示例代码和相关资料