2017-02-15 34 views
0

имеет следующий столбец в моей SQLкомплектации нечисловые и Числовые от VARCHAR

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

Я хочу, чтобы извлечь номера и не числовые символы от него, поэтому у меня есть выход, как это:

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

Может кто-то указать, в каком направлении мне нужно начать искать. В столбце содержится около 700 записей, и соглашения об именах не соблюдались, поэтому может быть любое количество символов, предшествующих и следующих за номерами.

BTW: возвращенные символы не обязательно должны быть NULL per se, также работает пустая строка. Начальный нуль для чисел также не имеет значения.

+1

Не мог бы вы посмотреть на MYSQL stri ng на https://dev.mysql.com/doc/refman/5.7/ru/string-functions.html? Возможно, посмотрите на функцию регулярного выражения. – rajah9

ответ

0

MySQL имеет ряд строковых функций.

Для того чтобы вы начали работу, ознакомьтесь, пожалуйста, с MySQL Regex page.

Вот пример, который использует :alnum: для алфавитно-цифрового поиска. Подставляя :digit:, вам может пригодиться, чтобы извлечь цифры посередине.

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

Спасибо, что указал на регулярные выражения. Можете ли вы рассказать мне, как это может помочь мне извлечь цифры? До сих пор мне удалось проверить, соответствует ли запись шаблону, но до сих пор мне удалось получить TRUE или FALSE. –

+0

. Пожалуйста, взгляните на этот вопрос, который кажется очень похожим. http://stackoverflow.com/questions/11135464/finding-number-position-in-string – rajah9

0

вы можете создавать такие функции, как это: https://dba.stackexchange.com/questions/106535/how-to-split-numbers-and-text-in-mysql

С некоторыми изменениями для предварительного и

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 ; 

И запрос:

SELECT identifier,pre(identifier) as pre,num(identifier) as num,post(identifier) as post FROM table 
Смежные вопросы