一尘不染

LPAD前导零

lpad

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:

UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  

但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;

返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。

编辑:列NUMER为INT(19)并已包含如下数据:

NUMER
----------
1203  
12303 
123403 
1234503 
...

(目前,它已填充了3到7位不同长度的数据)


阅读 305

收藏
2021-04-16

共1个答案

一尘不染

我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。

当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。

您可以选择NUMER字段,如下所示,或为该表创建一个视图:

SELECT LPAD(NUMER,6,'0') AS NUMER
FROM ...

或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。

我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。

但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。

2021-04-16