2013-07-12 9 views
6

Ich habe Tabelle mit Rechnungsnummern. Richtlinien sagen, dass Zahlen 6 oder mehr Ziffern haben sollten. Zuerst einmal versucht zu tun:LPAD mit führender Null

UPDATE t1 SET NUMER=CONCAT('00000',NUMER) WHERE LENGTH(NUMER)=1; 
UPDATE t1 SET NUMER=CONCAT('0000',NUMER) WHERE LENGTH(NUMER)=2; 
UPDATE t1 SET NUMER=CONCAT('000',NUMER) WHERE LENGTH(NUMER)=3; 
UPDATE t1 SET NUMER=CONCAT('00',NUMER) WHERE LENGTH(NUMER)=4; 
UPDATE t1 SET NUMER=CONCAT('0',NUMER) WHERE LENGTH(NUMER)=5; 

aber das ist nicht effizient und sogar hübsch. Ich habe versucht, LPAD Funktion, aber dann kam Problem, weil Funktion:

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ; 

gibt Null Zeilen betroffen. Auch googelt und sie sagen, dass Null in Anführungszeichen setzen Problem lösen wird, aber tat, keine Hilfe? Es ist täglicher Import.

EDIT: Column NUMER ist INT (19) und enthält bereits Daten wie:

NUMER 
---------- 
1203 
12303 
123403 
1234503 
... 

+2

Welchen Datentyp hat Ihre 'NUMER'-Spalte? Und wenn Sie das 'ZEROFILL'-Attribut nicht auf einen numerischen Wert anwenden, lösen Sie Ihr Problem nicht schon? http://dev.mysql.com/doc/refman/5.5/en/numeric-type-attributes.html – CBroe

+0

Sie können die Spalte INT nicht aktualisieren, um die Anzahl der führenden/abschließenden Nullen zu enthalten. Auch INT (19) ist sinnlos. Das ist keine Ganzzahl mit 19 Ziffern. Es ist eine 4-Byte-Integer (2 bis 32), mit einer Display-Länge von 19. Display-Länge tut, was es sagt - es ist, wie viele Ziffern es angezeigt wird, daher tut es nichts mit der tatsächlichen Länge der Zahl in Ziffern. Lange Rede, kurzer Sinn - beginnen Sie mit einer 6-stelligen Rechnung und erhöhen Sie die Anzahl. –

+0

@CBroe, nein, ZEROFIL ist nicht gut, weil ich historische Daten z. 1203 hat sich in 001203 geändert, und ich habe 7 Ziffern. Also werde ich alle Geschichte nach jeder Zahl von Ziffern Erweiterung – jaczes

Antwort

23

Ich denke, Sie sollten bedenken, dass die Richtlinien, die Sie zu lesen, anwenden, wie eine Rechnung angezeigt werden soll, und nicht, wie es sollte in der Datenbank gespeichert werden.

Wenn eine Zahl als INT gespeichert ist, dann ist es eine reine Zahl. Wenn Sie vorne Nullen hinzufügen und speichern, ist es immer noch die gleiche Nummer.

Sie könnten das NUMER Feld wie folgt auswählen, oder eine Ansicht für diese Tabelle erstellen:

SELECT LPAD(NUMER,6,'0') AS NUMER 
FROM ... 

Oder anstatt die Daten zu ändern, wenn Sie es aus der Datenbank auswählen, sollten Sie die Zahl mit Nullen Klotzen, wenn Sie zeigen es an, und nur wenn Sie es anzeigen.

Ich denke, Ihre Forderung nach historischen Daten die gleiche ist ein strittiger Punkt zu bleiben. Auch für historische Daten ist eine Rechnung mit der Nummer 001203 identisch mit einer Rechnung mit der Nummer 1203.

Wenn Sie jedoch unbedingt so verfahren müssen, wie Sie es beschreiben, funktioniert die Konvertierung in ein VARCHAR-Feld möglicherweise. Konvertierte historische Daten können so wie sie sind gespeichert werden, und neue Einträge können auf die erforderliche Anzahl von Nullen aufgefüllt werden. Aber ich empfehle das nicht.

0

Feld (mit Daten mit unterschiedlicher Länge von 3 bis 7 Ziffern, die von nun gefüllt ist) in Die Tabelle ist eine int-Spalte, also speichert sie nur eine Zahl. Es gibt keine Möglichkeit, die Daten in der Tabelle auszupacken. 1 == 001 == 000000000001. Dies ist die gleiche Nummer.

Sie sollten das Padding auf der Anwendungsebene durchführen (das System, das die Daten aus der Tabelle holt). Was passiert, wenn die Bestellnummer über 999999 hinausgeht? Sie müssten dann alle Daten in der Tabelle aktualisieren, um eine zusätzliche 0 hinzuzufügen. Diese Art von Vorgang sollte nicht auf Datenbankebene durchgeführt werden.

Sie können auch die Daten aus mit einem LPAD wählen:

SELECT LPAD(NUMER,6,'0'), [other_columns] FROM t1; 

Alternative, wie CBroe erwähnt Sie den Datentyp INT(6) ZEROFILL sein, so ändern könnte, dass es richtig angezeigt wird, aber dies wird geändert werden müssen, wenn es geht über 999999 wie oben erwähnt ..

2

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ; wird nicht tun, was Sie erwarten, da das NUMER Feld ist ein int. Es wird die Zeichenkette '0' aus dem int 1234 erzeugen und dann in 1234 zurückverwandeln - deshalb ändert sich nichts.

ändern NUMERint(6) zerofill und MySQL-Pad es für Sie jedes Mal, wenn Sie es lesen geben.

Wenn Sie wirklich Nullen in der Datenbank gespeichert werden sollen, müssen Sie CHAR/VARCHAR die Art ändern, dann LPAD Update-Anweisung funktioniert.

Verwandte Themen