MYSQL:自编写的字符串操作函数返回意外结果

时间:2009-08-20 07:08:16

标签: mysql string function

我正在尝试以这样的方式实现MYSQL函数MY_LEFT_STR(STRING x,INT位置)

  • MY_LEFT_STR('HELLO',4) => 返回'HELL'(与内部LEFT功能相同)
  • MY_LEFT_STR('HELLO', - 1) => 返回'HELL'

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);

2 个答案:

答案 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?