2009-08-20 105 views
3

我想以这样的方式来实现MYSQL功能MY_LEFT_STR(串x,INT位置)是MYSQL:编写自己的字符串处理函数返回意外的结果

  • MY_LEFT_STR( 'HELLO',4) =>返回 '地狱'(同内部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 | 
+-----+-----+-----+ 

问题什么是错我的函数声明? (除了一个generall缺乏测试样MY_LEFT_STR( 'A' bordercases的, - 4) ...


答案:这么尴尬......答案就在双重利空的POS = -1

RETURN LEFT(in_str,LENGTH(in_str) - pos); 

这应该是

RETURN LEFT(in_str,LENGTH(in_str) + pos); 

回答

2

这里有一个线索:?什么的LENGTH(in_str) - (-1)结果

pos为负数时,则LENGTH(in_str) - pos产生的数字为,比文字长度长。所以LEFT()被绑定返回整个字符串,因为你要求的字符数多于字符串总长度。

+0

为什么这是错? – butterchicken 2009-08-20 07:12:30

+1

BANG(额头上的手的声音!=>我明白了,谢谢! – lexu 2009-08-20 07:14:20

2
RETURN LEFT(in_str,LENGTH(in_str) - pos); 

如果pos为负,将不定尺(in_str) - POS给你(你的例子):

LENGTH(HELLO) - (-1) = 6?