2009-08-20 9 views
3

Je suis en train de mettre en œuvre une fonction MYSQL MY_LEFT_STR (STRING x, la position INT) de telle sorte queMYSQL: fonction auto chaîne de manipulation écrite renvoie un résultat inattendu

  • MY_LEFT_STR ('BONJOUR', 4) => rendements HELL '(identique au fonctionnement interne de GAUCHE)
  • MY_LEFT_STR ('BONJOUR', - 1) => rendements 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; 

le résultat est

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 | 
+-----+-----+-----+ 

QUESTION Quel est le problème avec ma déclaration de fonction? (Outre le manque generall de tests pour bordercases comme MY_LEFT_STR ('A', - 4) ...


RÉPONSE: si ... embarassing la réponse réside dans le double négatif pos = -1 dans

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

cela devrait être

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

Répondre

2

Voici un indice: Quel est le résultat de LENGTH(in_str) - (-1) 0 Lorsque est négatif, LENGTH(in_str) - pos donne un nombre plus long que la longueur de la chaîne. Donc LEFT() est lié pour retourner la chaîne entière, parce que vous demandez plus de caractères que la longueur totale de la chaîne.

+0

Pourquoi est-ce mal? – butterchicken

+1

BANG (le son de la main frappe le front! => Je l'ai eu, merci! – lexu

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

Si pos est négatif, ne sera pas LONGUEUR (in_str) - pos vous donner (pour votre exemple):

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