2011-02-04 15 views
23

Mam bazę danych SQLite, która będzie zawierać produkty. Produkty te mają ustalony format złożonego numeru produktu, składający się z kategorii, grupy i numeru produktu (cccccc.gg.ppp). Za każdym razem, gdy wstawiany jest nowy produkt, nowy numer produktu powinien zostać zbudowany przy użyciu kategorii i numerów grup, a następnie najwyższego numeru produktu w tej grupie zwiększonego o jeden.Funkcja SQLite do formatowania liczb z wiodącymi zerami?

W tym celu rozważałem przechowywanie wszystkich trzech liczb w osobnych polach i użycie widoku do dynamicznego składania numeru produktu. Aby to działało, musiałbym dodać wiodące zera, ponieważ format numeru produktu jest poprawiony.

Jednak nie wydaje się znaleźć wbudowaną funkcją SQLite, który pozwoliłby mi to zrobić ... :-(

Wolałbym nie napisać funkcję niestandardową, ponieważ możemy mieć do udostępniać bazę danych innym programistom, aby mogli odczytać dane z, a ja nie mam pojęcia, jakiej platformy lub języka będą używać.

Czy to możliwe? Czy będziemy musieli znaleźć inne rozwiązanie?

Odpowiedz

48

Można to osiągnąć za pomocą odrobiny magii za pomocą łączenia ciągów i funkcji substr. Krótko mówiąc, oto, czego chcesz:

select substr('0000000000'||'1234', -10, 10) 

Poniżej wyjaśnienie.

Po pierwsze, należy wiedzieć, że operator konkatenacji ciągów SQLite to ||.

Zaczniemy od pobrania ciągu, który jest tak długi, jak wartość, którą chcemy zwrócić. Na przykład, jeśli chcesz zwrócić liczbę, która ma zawsze 10 znaków długości i pozostawić ją wypełnioną 0 s, jeśli jest krótsza, a następnie zacznij od ciągu dziesięciu 0 s. Do tego, połączymy liczbę, którą chcesz zwrócić. W naszym przykładzie jest to "1234". Do tej pory mamy tę część, która wygląda tak: '0000000000'||'1234'

Następnie przekaż tę rzecz do funkcji substr. According to the documentation, oto jak działa funkcja substr: funkcja

substr (X, Y, Z) Zwraca fragment łańcucha wejściowego X, który rozpoczyna się z Y-tego znaku i która jest Z. znaków. ... Jeśli Y ma wartość ujemną, wówczas pierwszy znak podciągu jest liczony od prawej, a nie od lewej.

Jeśli chcesz, aby ciąg składał się z 10 znaków, podaj -10 jako parametr Y (aby rozpocząć odliczanie od prawej strony, 10 znaków wstecz) i podaj 10 jako parametr Z (w sumie 10 znaków) .

+0

Brak opisu i istnieje podobna odpowiedź zaakceptowana :( –

+0

Jesteś szefem – Claudio

11

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10) działa, zamień '1234' z numerem produktu, dowolnej długości < = 10.

+0

Nie elegancki, ale funkcjonalny (+1). Dzięki. – Christian

0

Oprócz bezpośredniej odpowiedzi na pytanie z @ 9000, zastanów się, czy kategoria, grupa i numery produktów nie powinny być przechowywane jako tekst.

+0

Dlaczego powinny być przechowywane jako tekst kontra liczby? (Zwłaszcza numer produktu, ponieważ potrzebuję uzyskać jego maksymalną wartość + 1 dla następnego numeru produktu). – Martijn

+1

Tekst zachowuje początkowe zera. Jest coś do powiedzenia na przechowywanie "000123", gdy twoim wymaganiem jest przechowywanie "000123". –

+0

to nie jest problem. Muszę uzyskać następną wartość; co oznacza, że ​​jest on dostępny jako liczba, i przekształca go w łańcuch z prefiksem zero. Sposób przechowywania jest zupełnie odrębnym zagadnieniem. – Martijn

4

wiem, że to jest stare pytanie, ale po to prostsze:

-- zero-pad to 4 digits: 
select substr('0000'||3,-4); 

substr nie wymaga długość jeśli jesteś wybierając do końca.

Powiązane problemy