我正在尝试以这样的方式实现MYSQL函数MY_LEFT_STR(STRING x,INT位置)
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)这样的边框的测试......
ANSWER :非常尴尬......答案在于pos = -1的双重否定
RETURN LEFT(in_str,LENGTH(in_str) - pos);
这应该是
RETURN LEFT(in_str,LENGTH(in_str) + pos);
答案 0 :(得分:2)
以下是一条线索:LENGTH(in_str) - (-1)
的结果是什么?
当pos
为否定时,LENGTH(in_str) - pos
会产生一个更长的数字,而不是字符串的长度。所以LEFT()
必然会返回整个字符串,因为你要求的字符数多于字符串的总长度。
答案 1 :(得分:2)
RETURN LEFT(in_str,LENGTH(in_str) - pos);
如果pos
为负数,则LENGTH(in_str) - pos不会给你(例如):
LENGTH(HELLO) - (-1) = 6?