LPAD 带前导零

问题描述 投票:0回答:4

我有一张带有发票号码的表格。准则规定数字应包含 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位不同长度的数据)

mysql
4个回答
43
投票

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

当数字存储为 INT 时,它是纯数字。如果前面加零再存储,仍然是同一个数字。

您可以按如下方式选择 NUMER 字段,或为该表创建视图:

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

或者,不要在从数据库中选择数据时更改数据,而是考虑在显示数据时且仅在显示数据时用零填充数字。

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

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


7
投票

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ;
不会执行您期望的操作,因为
NUMER
字段是
int
。它将从 int 1234 创建字符串“001234”,然后将其转换回 1234 - 这就是没有变化的原因。

NUMER
更改为
int(6) zerofill
,MySQL 会在您每次阅读时为您填充。

如果您确实希望将零存储在数据库中,则必须将类型更改为

CHAR
/
VARCHAR
,然后您的
LPAD
更新语句将起作用。


0
投票

表中的字段是一个 int 列,因此它只存储一个数字。无法填充表中的数据。 1 == 001 == 000000000001。这是同一个数字。

您应该在应用程序级别(从表中提取数据的系统)进行填充。当订单号超过 999999 时会发生什么?然后,您必须更新表中的所有数据以添加额外的 0。这种事情不应该在数据库级别完成。

您还可以使用 LPAD 选择数据:

SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1;

替代方案,正如 CBroe 提到的,您可以将数据类型更改为

INT(6) ZEROFILL
,以便其正确显示,但如果如上所述超过 999999,则必须对其进行修改..


0
投票

就我而言,我是这样使用的:

SET @NVALUE= 5;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );

SET @NVALUE= 48;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );

SET @NVALUE= 100;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );

SET @NVALUE= 1500;
SELECT LPAD(@NVALUE, IF(CHAR_LENGTH(@NVALUE) <= 3, 3, CHAR_LENGTH(@NVALUE)), '0' );

结果:

  • 005
  • 048
  • 100
  • 1500
© www.soinside.com 2019 - 2024. All rights reserved.