2013-07-12 12 views
6

Mam tabelę z numerami faktur. Wytyczne mówią, że liczby powinny składać się z 6 lub więcej cyfr. Przede wszystkim próbowałem zrobić:LPAD z wiodącym zerem

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; 

ale to nie jest wydajne, a nawet ładne. Próbowałem LPAD funkcję, ale potem problem, ponieważ funkcję:

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

zwraca zero wierszy dotknięte. Również googled i mówią, że wprowadzenie zero w cudzysłów rozwiąże problem, ale nie, jakiejkolwiek pomocy? To codzienny import.

Edycja: Kolumna LICZBA int (19) i zawiera już danych: a

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

(to jest wypełnione danymi o różnej długości od 3 do 7 cyfr teraz)

+2

Jaki typ danych ma Twoja kolumna 'NUMER'? I czy nie używasz atrybutu 'ZEROFILL' na wartości numerycznej, który nie rozwiązał już twojego problemu? http://dev.mysql.com/doc/refman/5.5/en/numeric-type-attributes.html – CBroe

+0

Nie można zaktualizować kolumny INT, aby zawierała zmienną liczbę początkowych/końcowych zer. Również INT (19) jest bez sensu. To nie jest liczba całkowita z 19 cyframi. Jest to 4-bajtowa liczba całkowita (2 do potęgi 32), z długością wyświetlania równą 19. Długość wyświetlania robi to, co mówi - jest to liczba cyfr wyświetlanych, dlatego nie ma nic wspólnego z rzeczywistą długością liczby cyfr. Krótka historia - zacznij od sześciocyfrowej faktury i zwiększaj liczbę. –

+0

@ CBroe, nie, ZEROFIL nie jest dobry, ponieważ mam dane historyczne, np. 1203 zmieniono na 001203, a ja mam 7 cyfr. Tak więc będę musiał zmienić całą historię po każdym rozszerzeniu o jedną cyfrę – jaczes

Odpowiedz

23

myślę, że należy wziąć pod uwagę, że wytyczne przeczytałeś dotyczy jak faktura powinna być wyświetlane, a nie jak powinno być przechowywane w bazie danych.

Gdy liczba jest zapisana jako INT, jest to czysta liczba. Jeśli dodasz zera na początku i zapiszesz je ponownie, nadal będzie to ten sam numer.

Można wybrać pole Numer następująco lub utworzyć widok dla tej tabeli:

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

Albo raczej niż zmiana danych po wybraniu go z bazy danych, należy rozważyć dopełnienie liczby z zerami gdy wyświetlasz go i tylko wtedy, gdy go wyświetlasz.

Myślę, że twoje wymaganie, aby dane historyczne pozostały takie same, jest kwestią dyskusyjną. Nawet w przypadku danych historycznych faktura o numerze 001203 jest taka sama, jak w przypadku faktury o numerze 1203.

Jednak, jeśli absolutnie musisz to zrobić tak, jak opisujesz, wtedy konwersja do pola VARCHAR może działać. Przekonwertowane dane historyczne mogą być przechowywane tak jak są, a wszelkie nowe wpisy można dopełnić do wymaganej liczby zer. Ale nie polecam tego.

0

polu w tabela jest kolumną typu int, więc po prostu przechowuje liczbę. Nie ma sposobu na wyodrębnienie danych z tabeli. 1 == 001 == 000000000001. Jest to ten sam numer.

Powinieneś wykonać dopełnienie na poziomie aplikacji (system, który wyciąga dane z tabeli). Co się dzieje, gdy numer zamówienia przekracza 999999? Będziesz wtedy musiał zaktualizować wszystkie dane w tabeli, aby dodać dodatkowe 0. Tego rodzaju rzeczy nie powinno się robić na poziomie bazy danych.

Można także wybrać dane się z LpAd:

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

ewentualnie, jako CBroe wymienić można zmienić typ danych będzie INT(6) ZEROFILL tak, że wyświetla poprawnie, ale ten będzie musiał zostać zmodyfikowany, jeśli idzie powyżej 999999, jak wspomniano powyżej.

2

UPDATE t1 SET NUMER=LPAD(NUMER,6,'0') WHERE CHAR_LENGTH(NUMER)<=6 ; nie zrobi tego, czego się spodziewać, ponieważ pole NUMER to int. Tworzy ciąg "0" z int 1234, a następnie wrzuci go z powrotem do 1234 - dlatego nie ma zmian.

Zmień NUMER na typ int(6) zerofill, a MySQL podpisze go za każdym razem, gdy go przeczytasz.

Jeśli naprawdę chcesz zer przechowywane w bazie danych, trzeba zmienić typ do CHAR/VARCHAR, wówczas oświadczenie aktualizacja LPAD zadziała.

Powiązane problemy