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 命令的正确语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章