【问题标题】:trim non-numeric and numerics from varchar从 varchar 中修剪非数字和数字
【发布时间】:2017-02-15 14:14:57
【问题描述】:

在我的 SQL 中有以下列

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

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

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

谁能指出我需要从哪里开始寻找。该列有大约 700 条记录,并且没有遵循命名约定,因此 可以是数字前后的任意数量的字符。

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

【问题讨论】:

标签: mysql split varchar


【解决方案1】:

MySQL 有一些字符串函数会有所帮助。

要开始使用,请参阅MySQL Regex page

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

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

【讨论】:

  • 感谢您为我指出正则表达式。你能告诉我这些如何帮助我提取数字吗?到目前为止,我只能检查条目是否与模式匹配,但到目前为止,我只能检索 TRUE 或 FALSE
  • 请看这个问题,好像挺像的。 stackoverflow.com/questions/11135464/…
【解决方案2】:

你可以像这样创建函数: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

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2012-08-05
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多