回答

收藏

LPAD前导零

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

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:
; |1 a: l, U1 t6 g- k- B5 p, ^UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   2 z+ y! n4 _3 M% G3 w2 F- ~
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
& K$ c2 ]5 m, A+ RUPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  
3 X' k: @& t) k( A! ?1 W, p  W6 J' LUPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
4 f) H% y) f% W8 S# M- Q* O5 _; _UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  
% R: x/ T  S9 R/ |
6 j& p8 F% ^6 P( o. X但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:
" E& C  B9 Z. H$ s8 O1 c% M5 H1 ?1 AUPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。1 z0 o1 h0 O# p$ D, ^8 Z. \
编辑:列NUMER为INT(19)并已包含如下数据:5 s* m6 N% [6 S: i
NUMER; j8 r" P1 Q0 P% Z. {! e
----------
6 Q  [5 K' R7 S% u( R( [1203  
+ y% E  F2 e6 |/ E12303 7 W, w% c' |: B" X
123403   j0 ^: C' V9 Q4 I
1234503
( K5 v- H  L9 E2 ]& F7 r...
- v7 E' C( ?" }5 z- I1 g2 o% w
" r: ^8 P5 K4 J5 P$ s2 }" ]3 k+ }(目前,它已填充了3到7位不同长度的数据)6 a' o( q2 ~2 W1 B/ x1 m
               
8 m0 Q6 _# _: T* K  q解决方案:
& Z0 P9 T. O. u/ m; R5 i                + a3 ^9 t5 O5 G) X+ E( ]- ?
) M4 y9 R: O  y8 l

# L4 Y5 D( M' W4 a                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。
8 ~! ?- C# v0 |当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。
7 ]* T7 }: ~6 |8 S! q您可以选择NUMER字段,如下所示,或为该表创建一个视图:( `" |; T1 `* L8 v
SELECT LPAD(NUMER,6,'0') AS NUMER
9 o6 D6 {- a2 r7 {( _FROM ...
6 I$ e5 F0 R5 W' C, ], u3 G, H# R1 m- ?$ y
或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。; X# T2 }, q2 ^7 [  B
我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。( R: g+ `# F0 [7 R
但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则