回答

收藏

LPAD前导零

技术问答 技术问答 347 人阅读 | 0 人回复 | 2023-09-14

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:
+ C; x/ @7 f! V& t- o% mUPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   
% X% `/ N1 G) \2 Y- fUPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  / q5 M( I; V; L4 M6 T3 j
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  
4 @1 R2 m# E. `# QUPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
  ?" l" w& f: h: p6 y7 t8 _UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  : F4 l( F/ N( N" O
8 ^0 d- w% m. o, J
但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:! b- p, t8 _/ }% ~5 k( P
UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。
9 P+ J$ }7 V- {# X. b; s2 V编辑:列NUMER为INT(19)并已包含如下数据:- i1 K6 z* o! W/ X
NUMER' s5 m! D! x% A0 l
----------# M$ t5 V- h1 R
1203  
2 [3 C/ C, [2 U12303
+ ~$ F  X) X$ o5 w  p* i9 i123403 ) X, h, C% a. ~6 y
1234503 0 H: o! r: _7 Z* l
...$ R+ ]  Z: _4 u* _! [

2 h% @- b- f! D/ S: [(目前,它已填充了3到7位不同长度的数据)( @0 \: t+ D- _6 X
               
+ A1 z1 J8 y) C7 V* @. g9 h6 n解决方案:
6 d* `1 Q" k, Z                - a) w3 f8 k' t* Q
% q5 R6 a+ E" \1 t) ~3 o# b9 Y5 Q( J
' p- w+ q" S3 j7 P& u8 |, q
                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。
0 G! w, n/ a! f: O+ n  p, ?; U当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。) e0 S/ u% V3 v9 i, U( [
您可以选择NUMER字段,如下所示,或为该表创建一个视图:
* {3 A- r& T: [0 `2 Y) ]SELECT LPAD(NUMER,6,'0') AS NUMER
3 p8 `1 s3 Z6 z1 pFROM ...1 C& l5 S  g4 g9 x! y7 |
( K/ ~+ {4 d" F# C0 l) N4 M8 a+ N
或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。
  }3 ]) O7 T& Y$ q我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。
+ s. f% L9 f3 g  U( k$ K# L- X但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则