【问题标题】:MySQL build a variable name?MySQL 建立一个变量名?
【发布时间】:2014-02-08 10:59:55
【问题描述】:

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

我有一个由 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 ;

【问题讨论】:

    标签: mysql variables dynamic


    【解决方案1】:

    你不能SET CONCAT as in SET CONCAT('D',x) = MID(days, x, 1) 而是我认为更好地声明并将 concat 值设置为该变量并将该变量用于 IF 条件。另外,我认为您错过了在 IF 条件为真的情况下必须做的事情。

    【讨论】:

      【解决方案2】:

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

      对于这个函数,我意识到我什至不需要变量,因为我可以直接在 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 ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 2011-11-21
        • 2015-06-20
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        相关资源
        最近更新 更多