【发布时间】:2017-10-02 14:38:06
【问题描述】:
我希望替换 Mysql 表中的 cca 3 500 000 值。每个值都是AB00123012 形式的字符串,我希望删除字母后的前导零 - 即获取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 ;
虽然这可行,但速度相当慢,我想知道是否有更好的方法来做到这一点?
【问题讨论】:
-
当然。更好的方法是根本不这样做。您所拥有的是数据呈现问题。这些看起来像十六进制数字。只需在显示时格式化它们。几乎所有语言都得到很好的支持,成本几乎为零。
-
@e4c5 实际上我有充分的理由这样做 - 数据是从旧源导入的,值
A123和A000000123是同一件事。现在,当我搜索数据库时,我必须始终使用select * from Items where Code = 'A123' or Code = 'A000000123',这会显着降低查询速度。 -
所以这些不是您拥有的十六进制代码?
-
开头总是2个字母?或者也可能是这样的:
ABC09..? -
@OtoShavadze 开头有两个字母之一,然后是前导零,然后是数字(可能包括 0)。前导零填充字符串,所以我有 10 个字符。可能有点字符而不是字母。 (
.E00086425)