我希望在Mysql表中替换cca 3 500 000值。每个值都是AB00123012
形式的字符串,我希望在字母后删除前导零 - 即get AB123012
(应保留数字内的零)。
该值总是正好10个字符。
由于Mysql不允许用正则表达式替换,我使用了以下函数:
DELIMITER $$
CREATE FUNCTION fn_RawRingNumber (rn CHAR(10))
RETURNS CHAR(10) DETERMINISTIC
BEGIN
DECLARE newrn CHAR(10);
DECLARE pos INT(8);
DECLARE letters CHAR(2);
DECLARE nr CHAR(8);
IF (CHAR_LENGTH(rn) = 10) THEN
SET pos = (SELECT POSITION('0' IN rn));
SET letters = (SELECT SUBSTRING_INDEX(rn, '0', 1));
SET nr = (SELECT TRIM(LEADING '0' FROM SUBSTRING(rn,pos)));
SET newrn = (SELECT CONCAT(letters, nr));
ELSE
SET newrn = rn;
END IF;
RETURN newrn;
END$$
DELIMITER ;
虽然这有效,但它很慢,我想知道,如果没有更好的方法可以做到这一点?
答案 0 :(得分:1)
如果您能够让您的网站离线几分钟,最快的方法是转储,处理和重新导入。由于当前操作在该表上进行查询/插入的速度非常慢,因此无论如何您最好还是使用dump / process / import。
SELECT INTO OUTFILE是你的朋友
使用您最喜欢的编程语言,或者如果您很幸运能使用Linux,例如sed
甚至cut
。如果您需要有关正则表达式的帮助,请发表评论。
清理完桌子后。做一个LOAD DATA INFILE。
这三个步骤都应该相当快。特别是如果你在该列上有一个n索引。
答案 1 :(得分:0)
试试这个
注意:我没有对很多行进行测试,也不知道这是多么有效。
此外,如果速度很快,请在使用此功能之前,认为所有可能的变化(可能会出现在您的字符串中),可能是我错过了一些变体,不确定100%。
select case
when INSTR(col, '0') = 2 then concat( substr(col, 1, 1), substr(col, 2) * 1)
when INSTR(col, '0') = 3 and substr(col, 2, 1) not in('1','2','3','4','5','6','7','8','9') then concat( substr(col, 1, 2), substr(col, 3) * 1)
else col
end
from (
select 'AB00123012' as col union all
select 'A010000123' as col union all
select 'A1000000124' as col union all
select 'A0000000124' as col union all
select '.E00086425' as col
) t