mySQL 用户定义函数中 set 命令的正确语法是啥?

Posted

技术标签:

【中文标题】mySQL 用户定义函数中 set 命令的正确语法是啥?【英文标题】:What is the correct syntax for a set command within a mySQL user defined function?mySQL 用户定义函数中 set 命令的正确语法是什么? 【发布时间】:2011-04-05 13:35:55 【问题描述】:

尝试在 mysql 5.1 中创建函数时收到以下错误:

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 ;

我已经使用语法有一段时间了,我确信这是我忽略的一个非常小的细节。任何帮助将不胜感激。

【问题讨论】:

谢谢 manji...我是堆栈溢出的新手,我不知道如何阻止整个代码。 为了澄清,我认为错误与 set 语句有关。不过不确定。 别担心。你可以看这里:***.com/editing-help进行markdown编辑。 突出显示一段代码并按 ctrl-K,或单击编辑器工具栏中的 按钮。 好的,我下次试试。谢谢大家。 【参考方案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 ;

【讨论】:

这段代码和我原来的代码的区别是ELSE和IF之间的空格,对吗? 好的...我已经弄清楚了,IF、ELSEIF、ELSE 语句存在语法错误。我需要添加 END IF;线。谢谢德瓦特。 一些注意事项(就是上面的代码):尽量优化你的功能。例如。 - SUBSTRING(loginName,7) 的结果可以在变量中存储一次。您也将 VARCHAR(40) 作为输入变量传递,但返回 VARCHAR(20);所以,你的字符串将被修剪。【参考方案2】:

你可以使用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 $$

【讨论】:

我想返回 loginName 中的值。是否需要 RETURN 命令?返回登录名; ? 首先,您检查的是SUBSTRING(loginname,7) LIKE .. 而不是SUBSTRING(input,7) LIKE ..。这不正确吧?那么对于你的问题,RETURN loginName 是函数将返回的结果,所以当你这样做时:SELECT removeMethodAndBackslash('sdgdsdf\ndffgh') 你将拥有'ndffgh'

以上是关于mySQL 用户定义函数中 set 命令的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 函数在源码中的定义

内部使用 strsplit 的用户定义函数的语法

MySQL手册中find_in_set函数的语法

Mysql@和@@符号的详细使用说明

MySQL的FIND_IN_SET()函数

mysql常用函数用法