回答

收藏

LPAD前导零

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

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:
1 B/ |7 {* \/ @) t) ]UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   
9 Y# q( s! M7 C: V( YUPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
& k0 K- v- Y1 `* ?7 D# H* VUPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  ' s: j9 H! S# q: l: z- A* f/ Q
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
+ I$ f6 E" V3 DUPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  
, s: z' r, X6 N% M0 G1 S3 _8 ^( p* j; h2 M# ~- E/ |/ I) ^
但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:
: ~* J$ ~) l" k. KUPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。
5 _. K5 x2 ~( Q: G编辑:列NUMER为INT(19)并已包含如下数据:& K. j. H& e, c; f" r. e; V
NUMER) K' S4 w/ ?9 V" V; ]7 H9 u0 c
----------
; q& B9 n2 O8 [, x$ J+ @6 T1203  
0 k8 {4 F( x' E  T7 L' w/ A6 ?. K12303 " A3 L& r9 m3 W# Q1 p
123403
  C3 j2 r3 F# ?1234503
( \  z6 h% X9 I+ {...9 P8 \" b# q4 ^6 j& y( v( _
6 k- B5 Y! r1 o3 s
(目前,它已填充了3到7位不同长度的数据)
5 s2 ]$ R  c8 S) s& o2 `+ o                ( s0 X/ R% ?1 D! `
解决方案:
2 i9 T6 M( F3 R4 _/ Y, J               
% @. Z3 ^  L- m8 g5 e" w* m" X: i; X8 k% R

4 N+ E: M$ `7 u6 _9 l5 X+ W                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。
0 I9 M& y. B* K3 ?9 y$ p当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。
2 e) |. \! h) C, f6 A" l您可以选择NUMER字段,如下所示,或为该表创建一个视图:
' @9 S$ \7 X3 i( USELECT LPAD(NUMER,6,'0') AS NUMER
. p% A& A/ L2 o: G# SFROM ...+ o% ^  `* U, g) }% _0 F

9 A6 T: _6 G8 N0 e3 c或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。
1 W0 r2 K# \( b% W4 H0 J4 D/ e我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。
4 |/ c; g, s! Q6 W" T! ^% x' L但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则