2017-02-15 9 views
0

haben die folgende Spalte in meiner SQLtrim nicht-numerischen und Numerik von varchar

identifier 
---------- 
z250 
tr015 
011s 

Ich möchte die Zahlen und nicht numerische Zeichen daraus extrahieren, so habe ich eine Ausgabe wie folgt aus:

identifier | pre | number | post 
-----------+------+--------+----- 
z250  | z | 250 | NULL 
tr015  | tr | 015 | NULL 
11s  | NULL | 11  | s 

Kann jemand zeigen, auf welche Weise ich anfangen muss zu suchen. Die Spalte enthält etwa 700 Datensätze, und die Namenskonventionen wurden nicht befolgt, daher könnte es sich um eine beliebige Anzahl von Zeichen vor und nach den Zahlen handeln.

BTW: die zurückgegebenen Zeichen müssen nicht NULL per se sein, ein leerer String funktioniert auch. Die führende Null für die Zahlen spielt auch keine Rolle.

+1

Könnte man sich die MYSQL stri ng Funktionen unter https://dev.mysql.com/doc/refman/5.7/en/string-functions.html? Vielleicht sehen Sie sich die Regexp-Funktion an. – rajah9

Antwort

0

MySQL hat eine Reihe von String-Funktionen helfen.

Um zu beginnen, sehen Sie bitte die MySQL Regex page.

Hier ist ein Beispiel, das für eine alphanumerische Suche verwendet. Die Verwendung von :digit: könnte für Sie nützlich sein, um die Ziffern in der Mitte zu extrahieren.

mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+';  -> 1 
mysql> SELECT '!!' REGEXP '[[:alnum:]]+';    -> 0 
+0

Danke, dass Sie mich auf Regexes hinweisen. Können Sie mir sagen, wie diese mir helfen können, die Zahlen zu extrahieren? Bisher konnte ich nur überprüfen, ob ein Eintrag mit einem Muster übereinstimmt, aber bisher konnte ich nur TRUE oder FALSE –

+0

abrufen. Bitte werfen Sie einen Blick auf diese Frage, die sehr ähnlich zu sein scheint. http://stackoverflow.com/questions/11135464/finding-number-position-in-string – rajah9

0

können Sie Funktionen wie folgt erstellen: https://dba.stackexchange.com/questions/106535/how-to-split-numbers-and-text-in-mysql

Mit einigen Modifikationen für vor und nach der

DROP function IF EXISTS `pre`; 

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` FUNCTION `pre`(
vStr CHAR(75)) RETURNS char(32) CHARSET latin1 
BEGIN 
    DECLARE vInd, vLen SMALLINT DEFAULT 1; 
    DECLARE vReturn CHAR(32) DEFAULT ''; 
    DECLARE vCharacter CHAR(1); 
    REPEAT 
    SET vLen = CHAR_LENGTH(vStr); 
    BEGIN 
     SET vCharacter = MID(vStr,1,1); 
     IF vCharacter REGEXP '[[:digit:]|[:punct:]]' THEN 
       SET vReturn:=NULL; 
       RETURN vReturn; 
      ELSE 
      SET vCharacter = MID(vStr,vInd,1); 
     IF vCharacter REGEXP '[[:alpha:]]' THEN 
      SET vReturn=CONCAT(vReturn,vCharacter); 

     SET vInd =vInd+1; 
     ELSE 
      SET vInd:=vLen+1; 

     END IF; 
      END IF; 
    END; 
    UNTIL vInd > vLen END REPEAT; 
    RETURN vReturn; 
END$$ 

DELIMITER ; 


    DROP function IF EXISTS `post`; 
    DELIMITER $$ 
    CREATE DEFINER=`root`@`localhost` FUNCTION `post`(
    vStr CHAR(75)) RETURNS char(32) CHARSET latin1 
    BEGIN 
     DECLARE vInd,limite, vLen SMALLINT DEFAULT 1; 
     DECLARE vReturn CHAR(32) DEFAULT ''; 
     DECLARE vCharacter CHAR(1); 
     SET vInd = 1; 
     SET vLen = CHAR_LENGTH(vStr); 
     SET limite=vLen; 
     REPEAT 


       BEGIN 
      SET vCharacter = MID(vStr,vLen,1); 
      IF vCharacter REGEXP '[[:digit:]|[:punct:]]' THEN 
       SET vReturn:=NULL; 
       RETURN vReturn; 
      ELSE 

       SET vCharacter = MID(vStr,vLen-vInd+1,1); 

      IF vCharacter REGEXP '[[:alpha:]]' THEN 
       SET vReturn=CONCAT(vCharacter,vReturn); 

        SET vInd=vInd+1; 

      ELSE 
        SET vInd=limite+1; 

       END IF; 


      END IF; 
      END; 
      UNTIL vInd > limite END REPEAT; 
      RETURN vReturn; 

    END$$ 

    DELIMITER ; 

Und query:

SELECT identifier,pre(identifier) as pre,num(identifier) as num,post(identifier) as post FROM table