2009-08-20 2 views
3

Я пытаюсь реализовать функцию MY_LEFT_STR MYSQL (STRING х, INT положения) таким образом, чтоMYSQL: сама функция, написанная строка-манипуляция возвращает неожиданный результат

  • MY_LEFT_STR («ПРИВЕТ», 4) => возвращает 'АД' (такой же, как внутренней функции левого)
  • MY_LEFT_STR ('Привет', - 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', - 4) ...


ОТВЕТ: так смущают ... ответ лежит в двойной отрицательный для поз = -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

+1

BANG (звук руки ударил лбом! => Я получил его, спасибо! – lexu

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

Если pos отрицателен, не LENGTH (in_str) - поз дать вам (для примера):

LENGTH(HELLO) - (-1) = 6? 
Смежные вопросы