我想从列中删除所有非数字字符。我的数据库中有大量数据。
目前我正在使用以下链接中描述的方法:
http://venerableagents.wordpress.com/2011/01/29/mysql-numeric-functions/
问题是它花费了太多时间进行预处理。
对于 100 万行,当前逻辑需要 1 小时来处理数据。
请帮我..
谢谢你,罗纳克
我想从列中删除所有非数字字符。我的数据库中有大量数据。
目前我正在使用以下链接中描述的方法:
http://venerableagents.wordpress.com/2011/01/29/mysql-numeric-functions/
问题是它花费了太多时间进行预处理。
对于 100 万行,当前逻辑需要 1 小时来处理数据。
请帮我..
谢谢你,罗纳克
这是另一个旋转的东西......
演示: http ://sqlfiddle.com/#!2/0c96e/21
首先,为自己创建一个数字表
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');
然后这里有一个查询,只为您提供数字。应该更有效,因为它是基于 SET 而不是像您的函数示例那样迭代...
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
我假设你正在做类似的事情:
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;