从varchar中修剪非数字和数字

时间:2017-02-15 14:14:57

标签: mysql split varchar

在我的SQL中有以下列

404

我想从中提取数字和非数字字符,所以我有这样的输出:

Delete a virtual machine

有人指出我需要以哪种方式开始寻找。该列有大约700条记录,并且没有遵循命名惯例,因此可以是数字前后的任意数量的字符。

BTW:返回的角色本身不需要Get information about a virtual machine,空字符串也可以。数字的前导零也无关紧要。

2 个答案:

答案 0 :(得分:0)

MySQL有许多字符串函数会有所帮助。

为了帮助您入门,请参阅MySQL Regex page

以下是使用:alnum:进行字母数字搜索的示例。替换:digit:可能对您有用,可以提取中间的数字。

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

答案 1 :(得分: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