如何在批量数据中删除mysql列中的所有非数字字符

如何在批量数据中删除mysql列中的所有非数字字符,mysql,Mysql,我想从列中删除所有非数字字符。我的数据库中有大量数据 目前我使用的方法如下链接所述: 问题是它需要太多的时间进行预处理 对于100万行,当前逻辑需要1小时来处理数据 请帮帮我 谢谢,, Ronak我想你在做这样的事情: update myTable set foo = NumericOnly(foo); 我不知道你能做得比这好多少 不过,有一件事可能会有所帮助。在这个NumericOnly函数中,他们在做额外的工作。我将删除SET idx=LENGTH(val)+1行,因为所要做的就是再次开

我想从列中删除所有非数字字符。我的数据库中有大量数据

目前我使用的方法如下链接所述:

问题是它需要太多的时间进行预处理

对于100万行,当前逻辑需要1小时来处理数据

请帮帮我

谢谢,,
Ronak

我想你在做这样的事情:

update myTable set foo = NumericOnly(foo);
我不知道你能做得比这好多少

不过,有一件事可能会有所帮助。在这个
NumericOnly
函数中,他们在做额外的工作。我将删除
SET idx=LENGTH(val)+1行,因为所要做的就是再次开始检查字符串的结尾(我们已经检查过的部分)。带有5个前导非数字的字符串将被完整检查5次

删除该行将留下:

DROP FUNCTION IF EXISTS NumericOnly;

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
 RETURNS VARCHAR(255)
BEGIN
 DECLARE idx INT DEFAULT 0;
 IF ISNULL(val) THEN RETURN NULL; END IF;

 IF LENGTH(val) = 0 THEN RETURN ""; END IF;

 SET idx = LENGTH(val);
  WHILE idx > 0 DO
    IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN
     SET val = REPLACE(val,SUBSTRING(val,idx,1),"");
    END IF;
    SET idx = idx - 1;
  END WHILE;
  RETURN val;
 END;

这是另一个关于事物的旋转

演示:

首先,自己创建一个数字表

CREATE TABLE numbers (
   number int NOT NULL PRIMARY KEY
);

INSERT INTO numbers (number)
SELECT n0 + n1 + n2 + n3 + n4 + n5
FROM   (SELECT 0 AS n0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) AS z0
 CROSS
  JOIN (SELECT 0 AS n1 UNION SELECT 4 UNION SELECT 8 UNION SELECT 12) AS z1
 CROSS
  JOIN (SELECT 0 AS n2 UNION SELECT 16 UNION SELECT 32 UNION SELECT 48) AS z2
 CROSS
  JOIN (SELECT 0 AS n3 UNION SELECT 64 UNION SELECT 128 UNION SELECT 192) AS z3
 CROSS
  JOIN (SELECT 0 AS n4 UNION SELECT 256 UNION SELECT 512 UNION SELECT 768) AS z4
 CROSS
  JOIN (SELECT 0 AS n5 UNION SELECT 1024 UNION SELECT 2048 UNION SELECT 3072) AS z5
ORDER
    BY 1;
下面是一些示例数据

CREATE TABLE your_table (
   foo varchar(50)
);

INSERT INTO your_table (foo)
  VALUES ('124nhasfonasf13')
       , ('NONE')
       , ('r937')
       , ('o9o9')
       , ('n444n4n455n')
       , ('blah');
然后这里有一个查询,只提供数字。应该更有效,因为它是基于集合的,而不是像您的函数示例那样迭代的

SELECT foo
     , Group_Concat(c ORDER BY position SEPARATOR '')
FROM   (
        SELECT vals.foo
             , numbers.number As position
             , SubString(vals.foo, numbers.number, 1) As c
        FROM   (
                SELECT foo
                     , Length(foo) As lngth
                FROM   your_table
                WHERE  foo REGEXP '[0-9]'
               ) As vals
         INNER
          JOIN numbers
            ON numbers.number BETWEEN 1 AND vals.lngth
       ) As x
WHERE  c REGEXP '[0-9]'
GROUP
    BY foo

我的解决方案成功了吗?我认为它可能是一个很好的竞争者!