回答

收藏

LPAD前导零

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

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:5 r' e  m: R. E
UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   ! a( p+ D3 u$ o2 v! p6 C
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
4 V- k; [) V: |+ s; TUPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  
, Y& @, W4 |- D1 yUPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  , h) x; [' R. w
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  # t0 ?, L) z7 K2 r  d

5 Z0 C8 s3 A7 K# P但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:) L" u- D6 s9 R$ n! P' x  \3 ]
UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。+ P' {1 r8 O1 l8 e9 ]3 i& ?
编辑:列NUMER为INT(19)并已包含如下数据:7 T, X. R9 {( v7 @" T( F
NUMER
* B3 Y1 a! B, F----------! X/ {% V( X! W+ p# A1 W
1203  # O) p# X4 Z; U
12303 3 n5 s: C$ Y) I
123403 0 k3 D2 Z( ?# Y& r" X! u# p6 `
1234503 % Z5 e+ ?0 _. V! N/ S2 o6 r. I
...
, ^- m: }+ s( y1 d& Q# F5 Q) k4 C) L( p! r
(目前,它已填充了3到7位不同长度的数据), }' }% _, i5 Z# K
                . @5 H5 i+ T  F: _& m
解决方案:
. a& F. k4 T% V9 r4 `( Q7 \                # s- g/ n$ @* s0 t
! l2 u2 _9 B0 T8 a4 P. J

* E, w& s, N1 Z                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。
3 z8 T0 d" X) A1 m# c4 y# n当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。  r2 s0 ^7 |. a' J
您可以选择NUMER字段,如下所示,或为该表创建一个视图:
- R. f# I( H: q' G9 G! ^SELECT LPAD(NUMER,6,'0') AS NUMER; Y3 X1 m- _/ `0 Q' P8 @! w2 N) s
FROM ...1 {, L, t) V: B/ H' E! E4 p

) Z# r; y) C* L或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。
1 C/ g4 w  z% w0 X% s我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。
0 P  r' C1 N7 U$ U但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则