2011-04-05 79 views
1

我收到試圖在MySQL 5.1中創建一個功能時,出現以下錯誤:mySQL用戶定義函數中set命令的正確語法是什麼?

Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 25 (0 ms taken)

這裏是我的代碼:

DELIMITER $$ 

CREATE 
    FUNCTION removeMethodAndBackslash(input VARCHAR(40)) 
    RETURNS VARCHAR(20) 
    BEGIN 

    DECLARE loginName VARCHAR(40); 
    SET loginName = input; 

    IF SUBSTRING(loginName,7) LIKE '\b%' THEN 
     SET loginName = 'b' + SUBSTRING(input,8); 

    ELSE IF SUBSTRING(loginName,7) LIKE '\n%' THEN 
     SET loginName = 'n' + SUBSTRING(input,8); 

    ELSE IF SUBSTRING(loginName,7) LIKE '\t%' THEN 
     SET loginName = 't' + SUBSTRING(input,8); 

    ELSE IF SUBSTRING(loginName,7) LIKE '\r%' THEN 
     SET loginName = 'r' + SUBSTRING(input,8); 

    ELSE 
     SET loginName = SUBSTRING(input,7); 

    RETURN loginName; 

END $$ 

DELIMITER ; 

我一直在玩的語法爲而我確信它是我忽略的一個非常小的細節。任何幫助將不勝感激。

+0

由於滿級...我是新來的堆棧溢出,我無法弄清楚如何阻止整個碼。 – 2011-04-05 13:40:49

+0

爲了澄清,我相信這個錯誤與set語句有關。但不知道。 – 2011-04-05 13:42:49

+0

別擔心。你可以看看這裏:http://stackoverflow.com/editing-help進行降價編輯。 – manji 2011-04-05 13:42:51

回答

1

嘗試這一個 -

DELIMITER $$ 

CREATE 
    FUNCTION removeMethodAndBackslash(input VARCHAR(40)) 
    RETURNS VARCHAR(20) 
    BEGIN 

    DECLARE loginName VARCHAR(40); 
    SET loginName = input; 

    IF SUBSTRING(loginName,7) LIKE '\b%' THEN 
     SET loginName = 'b' + SUBSTRING(input,8); 

    ELSEIF SUBSTRING(loginName,7) LIKE '\n%' THEN 
     SET loginName = 'n' + SUBSTRING(input,8); 

    ELSEIF SUBSTRING(loginName,7) LIKE '\t%' THEN 
     SET loginName = 't' + SUBSTRING(input,8); 

    ELSEIF SUBSTRING(loginName,7) LIKE '\r%' THEN 
     SET loginName = 'r' + SUBSTRING(input,8); 

    ELSE 
     SET loginName = SUBSTRING(input,7); 
    END IF; 

    RETURN loginName; 

END $$ 

DELIMITER ; 
+0

與此代碼和我的原始代碼的區別是ELSE和IF之間的空格,正確嗎? – 2011-04-05 13:49:00

+0

好吧......我已經知道了,IF,ELSEIF,ELSE語句存在語法錯誤。我需要添加END IF;線。謝謝Devart。 – 2011-04-05 13:59:34

+0

一些通知(只是上面的代碼):嘗試優化你的功能。例如。 - SUBSTRING(loginName,7)的結果可以在變量中存儲一次。此外,您還將VARCHAR(40)作爲inpup變量傳遞,但返回VARCHAR(20);所以,你的字符串將被修剪。 – Devart 2011-04-06 07:13:48

1

可以使用CASE...THEN...ELSE

DELIMITER $$ 

CREATE FUNCTION removeMethodAndBackslash(input VARCHAR(40)) 
RETURNS VARCHAR(20) 
    BEGIN 

    DECLARE loginName VARCHAR(40); 

    SET loginName = 
     CASE WHEN SUBSTRING(input,7) LIKE '\b%' THEN 'b' + SUBSTRING(input,8) 
      WHEN SUBSTRING(input,7) LIKE '\n%' THEN 'n' + SUBSTRING(input,8) 
      WHEN SUBSTRING(input,7) LIKE '\t%' THEN 't' + SUBSTRING(input,8) 
      WHEN SUBSTRING(input,7) LIKE '\r%' THEN 'r' + SUBSTRING(input,8) 
      ELSE SUBSTRING(input,7) 
     END; 

    RETURN loginName; 

END $$ 
+0

我想返回loginName中的值。是否需要RETURN命令? RETURN登錄名; ? – 2011-04-05 13:55:34

+0

首先,你正在檢查'SUBSTRING(loginname,7)LIKE ..''' SUBSTRING(input,7)LIKE ..'。這是不正確的權利?那麼對於你的問題,'RETURN loginName'是函數返回的結果,所以當你這樣做時:'SELECT removeMethodAndBackslash('sdgdsdf \ ndffgh')'你將擁有''ndffgh''。 – manji 2011-04-05 14:03:43

相關問題