因为一些原因,想尝试在mysql中使用json数组,循环取值时比较方便,但是在测试时发现取出来的值可以显示正确,但是用在函数中时却无法得到正确的结果,用cast函数转换后依旧无法得出正确的结果,测试代码如下:
SELECT JSON_ARRAYAGG(JSON_OBJECT('rulename',rulename,'daynum',daynum,'qcrule',qcrule,'qcjg',qcjg)) INTO @jsonstr from f_calrule WHERE state = 1 AND calid = 1 ORDER BY id;
SELECT JSON_EXTRACT(@jsonstr,'$[4].daynum') INTO @daynum;
SELECT JSON_EXTRACT(@jsonstr,'$[4].qcrule') INTO @qcrule;
SELECT JSON_EXTRACT(@jsonstr,'$[4].qcjg') INTO @qcjg;
SELECT cast(@daynum as UNSIGNED INTEGER) INTO @daynum1;
SELECT cast(@qcrule as CHAR) INTO @qcrule1;
SELECT cast(@qcjg as UNSIGNED INTEGER) INTO @qcjg1;
SELECT f_calnum(@daynum,@qcrule,@qcjg,'132312428485653536','2020-06-08') INTO @r;
SELECT f_calnum(@daynum1,@qcrule1,@qcjg1,'132312428485653536','2020-06-08') INTO @r1;
SELECT f_calnum(90,"天",1,'132312428485653536','2020-06-08') INTO @r2;
SELECT @jsonstr,@rulename,@daynum,@daynum1,@qcrule,@qcrule1,@qcjg,@qcjg1,@r,@r1,@r2;
测试结果如下:
如图,@r2是正确结果,是直接将取出来的值填入函数的参数表中得到的。从json数组中提取出来的结果直接放在函数参数表中以及转换完类型再放入函数参数表中得到的计算结果@r和@r1都为0,显然是不对的。但是在结果中可以看到从json数组中取出来的@daynum、@qcrule、@qcjg的值是没有问题的,我不知道究竟是数据类型的问题还是其他原因导致结果的错误,如果是数据类型的问题,为什么用cast转换类型后依旧不能得到正确的结果呢?求大佬解惑!
PS:附上我用的函数的定义:
CREATE DEFINER=`root`@`localhost` FUNCTION `f_calnum`(daynum INT,qcrule varchar(255),qcjg INT,puserid varchar(255),caldate date) RETURNS int(11)
测试软件如下:
navicat版本为:navicat premium 12.0.11 x64
mysql版本为:mysql-5.7.23-winx64