Mysql:替换文本中的前导零

时间:2017-05-04 12:07:41

标签: mysql regex replace

我希望在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 ;

虽然这有效,但它很慢,我想知道,如果没有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

如果您能够让您的网站离线几分钟,最快的方法是转储,处理和重新导入。由于当前操作在该表上进行查询/插入的速度非常慢,因此无论如何您最好还是使用dump / process / import。

第1步转储。

SELECT INTO OUTFILE是你的朋友

第2步流程

使用您最喜欢的编程语言,或者如果您很幸运能使用Linux,例如sed甚至cut。如果您需要有关正则表达式的帮助,请发表评论。

第3步重新导入

清理完桌子后。做一个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