我正在尝试以这种方式实现MYSQL函数MY_LEFT_STR(STRING x,INT position)
> MY_LEFT_STR(‘HELLO’,4)=>返回“ HELL”(与内部LEFT函数相同)
> MY_LEFT_STR(‘HELLO’,-1)=>返回“地狱”
DROP FUNCTION IF EXISTS MY_LEFT_STR;
CREATE FUNCTION MY_LEFT_STR(
in_str VARCHAR(255),
pos INT
)
RETURNS VARCHAR(255)
BEGIN
IF (pos < 0) THEN
RETURN LEFT(in_str,LENGTH(in_str) - pos);
ELSE
RETURN LEFT(in_str,pos);
END IF;
END;
结果是
select left_str('HELLO', 4) as A
, left_str('HELLO',-1) as B
, left('HELLO',length('HELLO')-1) as C
from dual
+-----+-----+-----+
| A | B | C |
+-----+-----+-----+
|HELL |HELLO|HELL |
+-----+-----+-----+
问题我的函数声明有什么问题? (除了普遍缺乏对MY_LEFT_STR(‘A’,-4)之类的边界案例的测试…
答案:令人尴尬…答案在于pos = -1的双重否定
RETURN LEFT(in_str,LENGTH(in_str) - pos);
这应该是
RETURN LEFT(in_str,LENGTH(in_str) + pos);