2011-04-05 26 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

相关问题