回答

收藏

LPAD前导零

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

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:- G. ]7 g6 ~. @& B% B+ ?1 K
UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   
; {2 T. W' O& m2 _& O. zUPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  ! i, a5 W8 A8 G, y$ ~
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  ! v6 z( y; R' a
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  " {/ q) r  N" i* I, I
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  
; t) y( o! x% h
, b/ n1 k: E9 M) p' p- x# _但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:* O6 Q4 ~& D6 |0 Z" w
UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。% D  i1 S: K9 t+ Q. V+ b' q
编辑:列NUMER为INT(19)并已包含如下数据:
3 M6 b$ M0 z) t$ I& [, x+ gNUMER
8 Z- X/ K" o& w5 Q----------# q7 j/ B/ a  f1 _
1203  
: Y- K6 F5 u1 s5 U: l7 O12303 # C1 X9 L/ Z6 S; n* v
123403 0 F6 E$ w7 i! X3 \# b$ n% w
1234503
9 i$ b, E3 s$ k* T' a...
; d# A( F8 ^. g& P# k/ P
: U( r4 ~+ I) B(目前,它已填充了3到7位不同长度的数据)4 t2 N8 R1 l9 [, N* [. P8 L) a( x4 b
               
/ W6 G- e# \$ y解决方案:6 [  n5 P1 E4 M
               
0 L8 O" ~0 j3 B0 u! N" D+ y, }9 y% R+ e6 d
7 ?- i$ n8 F, J7 f/ z/ ~
                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。9 N' T5 b% x/ u$ t) ?( A
当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。
# S3 R0 P/ n0 F+ i+ l$ t您可以选择NUMER字段,如下所示,或为该表创建一个视图:
1 s0 ~' S$ J8 ~$ S( dSELECT LPAD(NUMER,6,'0') AS NUMER
% z  d" h* G0 T4 C& mFROM ...
& y$ v4 J5 y8 Q
8 D9 u# k) g  {" f% G或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。: p6 e! H0 b* |5 w" E) ]
我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。+ O, Y. O, r. h, l- }  f" U
但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则