回答

收藏

LPAD前导零

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

我有发票号码表。准则说数字应该有6个或更多的数字。首先尝试做:
: N9 w; u- e. D' M4 S6 {UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1;   1 h; ]; h3 [# O
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2;  
( M/ ]: ?9 n  hUPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3;  4 `* h3 E; m4 v0 L$ M
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4;  
, C8 B$ R, ], ^* `5 dUPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5;  
, @- U3 B7 c& ?# k9 e$ A& [
) c, U3 p6 R& y9 i8 W  b; s但这效率不高,甚至还很漂亮。我尝试了LPAD功能,但是后来出现了问题,因为功能:
; c0 g8 n  c1 j9 hUPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)返回受影响的零行。还用谷歌搜索,他们说将引号设为零将解决问题,但是没有帮助吗?这是日常导入。' {4 Z% M3 z- M4 u  [
编辑:列NUMER为INT(19)并已包含如下数据:8 X# S7 s! t8 _. r2 N! N/ c
NUMER
# ]. E, ~8 t/ R! m! N* Q' R, U----------
: E( W* l( q3 M$ I+ y  D1203    D' L  ?" x- X$ q  P
12303 8 m8 D9 V! m4 Y5 ]
123403
$ e9 y2 p/ W" H5 i- d4 `1234503
+ A2 [7 m2 S( J9 o" J, Y4 J7 z: r...* p* T& d8 u" O4 b# h, X* x

  X! L. }- s3 W  U) {$ U) `9 n(目前,它已填充了3到7位不同长度的数据). y3 i9 C8 j4 T7 i: f4 g  i
                8 s4 ^+ U3 f5 N4 p0 Z8 G
解决方案:5 @" S* Q5 d2 |3 A
               
& R4 X$ F& t, t! N! P4 O+ k! n
# G* u3 G' h) e$ [+ l3 V) H- f! U9 K+ A8 ]; M7 K3 E! G- |# Q8 m8 B+ }, z
                我认为您应该考虑阅读的指南适用于发票的显示方式,而不适用于如何将其存储在数据库中。% {. Y4 r; |( K0 j: W9 h
当数字存储为INT时,它是一个纯数字。如果在前面加上零并再次存储,则它仍然是相同的数字。
* s7 y- u* [% Q# A  ~( }您可以选择NUMER字段,如下所示,或为该表创建一个视图:4 r, c9 L+ p, k" `# J
SELECT LPAD(NUMER,6,'0') AS NUMER! V! a6 i4 Q, y. k! x$ J
FROM ...
( e& v) ]/ Y/ }8 b7 U" y* N+ s4 w$ v# |+ ~% Q* X1 ]: V  I$ C
或者,不要在从数据库中选择数据时更改数据,而应该在显示时(仅在显示时)用数字填充数字。
+ ~# s4 X8 P, O0 k我认为您对历史数据保持不变的要求是有争议的。即使是历史数据,发票001203也与发票1203相同。5 i1 ]' q, d- S
但是,如果您绝对必须按照描述的方式进行操作,则可以转换为VARCHAR字段。转换后的历史数据可以原样存储,任何新条目都可以填充为所需的零。但我不建议这样做。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则