Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL是否构建变量名?_Mysql_Variables_Dynamic - Fatal编程技术网

MySQL是否构建变量名?

MySQL是否构建变量名?,mysql,variables,dynamic,Mysql,Variables,Dynamic,我试图在用户定义的函数中动态地构建一个变量名,但它似乎不起作用。有没有办法做到这一点,或者使用数组变量 我有一个由7个字符组成的字符串,表示一周中的几天(1234567或1_3_5_7,等等)。我想评估一周内选择一天的频率(从0到7)。我想,使用循环遍历所有7个位置是最简单的,但我收到一条错误消息 [Err]1193-未知系统变量“CONCAT” 有什么关于我如何做到这一点的提示吗?这是我的代码: DELIMITER $$ DROP FUNCTION IF EXISTS fn_freq$$

我试图在用户定义的函数中动态地构建一个变量名,但它似乎不起作用。有没有办法做到这一点,或者使用数组变量

我有一个由7个字符组成的字符串,表示一周中的几天(1234567或1_3_5_7,等等)。我想评估一周内选择一天的频率(从0到7)。我想,使用循环遍历所有7个位置是最简单的,但我收到一条错误消息

[Err]1193-未知系统变量“CONCAT”

有什么关于我如何做到这一点的提示吗?这是我的代码:

DELIMITER $$

DROP FUNCTION IF EXISTS fn_freq$$

CREATE FUNCTION fn_freq(days INT) RETURNS INT

BEGIN
        DECLARE D1 VARCHAR(1);
        DECLARE D2 VARCHAR(1);
        DECLARE D3 VARCHAR(1);
        DECLARE D4 VARCHAR(1);
        DECLARE D5 VARCHAR(1);
        DECLARE D6 VARCHAR(1);
        DECLARE D7 VARCHAR(1);

        DECLARE x INT;
        DECLARE fn_freq INT;
        SET x =1;
        SET fn_freq = 0;

        WHILE x < 8 DO
            SET CONCAT('D',x) = MID(days, x, 1);
            IF CONCAT('D',x) = '_' THEN
            ELSE
               SET fn_freq = fn_freq + 1;
               SET x = x + 1;
            END IF;
            SET x = x + 1;
        END WHILE;

        RETURN fn_freq;
END$$

DELIMITER ;
分隔符$$
下降功能(如果存在)$$
创建函数fn_freq(days INT)返回INT
开始
声明D1 VARCHAR(1);
声明D2 VARCHAR(1);
声明D3 VARCHAR(1);
声明D4 VARCHAR(1);
声明D5 VARCHAR(1);
声明D6 VARCHAR(1);
声明D7 VARCHAR(1);
声明x INT;
声明fn_freq INT;
设置x=1;
设置fn_freq=0;
当x<8时
设置CONCAT('D',x)=中间(天,x,1);
如果CONCAT('D',x)='\ux',则
其他的
设置fn_freq=fn_freq+1;
设置x=x+1;
如果结束;
设置x=x+1;
结束时;
返回fn_freq;
结束$$
定界符;

您不能
将CONCAT设置为SET CONCAT('D',x)=MID(days,x,1)
相反,我认为最好声明并将CONCAT值设置为该变量,并将该变量用于IF条件。我还认为,如果情况属实,你错过了在这种情况下必须做的事情

谢谢你的回复。我让它像这样工作,但我仍然很好奇,在其他一些情况下,如何动态地创建一个变量

对于这个函数,我意识到我甚至不需要变量,因为我可以在if子句中直接计算它

DELIMITER $$

DROP FUNCTION IF EXISTS fn_freq$$
CREATE FUNCTION fn_freq(days VarChar(7)) RETURNS INT
BEGIN
        DECLARE x INT;
        DECLARE fn_freq INT;
        SET x =1, fn_freq = 0;
        WHILE x < 8 DO
            IF MID(days, x, 1) <> '_' THEN
               SET fn_freq = fn_freq + 1;
            END IF;
            SET x = x + 1;
        END WHILE;
    RETURN fn_freq;
END$$
DELIMITER ;
分隔符$$
下降功能(如果存在)$$
创建函数fn_freq(days VarChar(7))返回INT
开始
声明x INT;
声明fn_freq INT;
设置x=1,fn_freq=0;
当x<8时
如果中间(天,x,1)uu,那么
设置fn_freq=fn_freq+1;
如果结束;
设置x=x+1;
结束时;
返回fn_freq;
结束$$
定界符;