2014-01-19 128 views
4

我想在用戶定義的函數內動態地創建一個變量名,但它似乎不起作用。有沒有辦法做到這一點或通過使用數組變量?MySQL構建變量名稱?

我有一個由7個字符組成的字符串,代表了一週中的幾天(1234567或1_3_5_7等)。我想要評估每天選擇一週的頻率(從0到7)。我想,這將是最容易使用的循環要經過所有的7個位置,但我得到一個錯誤信息說

[錯誤] 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 ; 

回答

0

你不能SET CONCAT as in SET CONCAT('D',x) = MID(days, x, 1)什麼,而不是我想會更好申報&的CONCAT值設置爲變量,並使用該變量的IF條件。此外,我認爲你錯過了在IF條件爲真的情況下必須完成的事情。

0

感謝您的回覆。我是這樣工作的,但我仍然好奇,在其他一些情況下如何動態創建變量。

對於這個函數,我意識到我甚至不需要該變量,因爲我可以直接在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 ;