Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从varchar中修剪非数字和数字_Mysql_Split_Varchar - Fatal编程技术网

Mysql 从varchar中修剪非数字和数字

Mysql 从varchar中修剪非数字和数字,mysql,split,varchar,Mysql,Split,Varchar,在我的SQL中包含以下列 identifier ---------- z250 tr015 011s 我想从中提取数字和非数字字符,因此我有如下输出: identifier | pre | number | post -----------+------+--------+----- z250 | z | 250 | NULL tr015 | tr | 015 | NULL 11s | NULL | 11 | s 有人能指出

在我的SQL中包含以下列

identifier
----------
z250
tr015
011s
我想从中提取数字和非数字字符,因此我有如下输出:

identifier | pre  | number | post
-----------+------+--------+-----
z250       | z    | 250    | NULL
tr015      | tr   | 015    | NULL
11s        | NULL | 11     | s
有人能指出我需要从哪一方面开始寻找吗。该列有大约700条记录,并且没有遵循命名约定,因此该列可以是数字前后任意数量的字符


顺便说一句:返回的字符本身不需要是
NULL
,空字符串也可以。数字的前导零也不重要。

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

要开始,请参阅

下面是一个使用
:alnum:
进行字母数字搜索的示例。取代<代码>:数字:可以用来提取中间的数字。

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

您可以创建如下函数:

对前后进行了一些修改

 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

你能看看MYSQL的字符串函数吗?也许可以看看regexp函数。谢谢你给我指点regex。你能告诉我这些如何帮助我提取数字吗?到目前为止,我只能检查条目是否与模式匹配,但到目前为止,我只能检索到TRUE或False。请看一下这个问题,它似乎非常相似。