Uzupełnienie zer po lewej stronie w postgreSQL

103

Jestem stosunkowo nowy w PostgreSQL i wiem, jak wpisać liczbę zerami po lewej stronie w SQL Server, ale staram się to rozgryźć w PostgreSQL.

Mam kolumnę liczbową, w której maksymalna liczba cyfr to 3, a min to 1: jeśli jest to jedna cyfra, to ma dwa zera po lewej, a jeśli ma 2 cyfry, ma 1, np 001, 058, 123.

W SQL Server mogę skorzystać z:

RIGHT('000' + cast([Column1] as varchar(3)), 3) as [Column2]

To nie istnieje w PostgreSQL. Każda pomoc będzie mile widziana.

Ben
źródło
2
Korzystanie z Google dokładnie tak , jak znalazłem tę stronę. To był mój wynik numer jeden w Google.
Jason
Możliwy duplikat funkcji to_char (liczba) w postgresie
Evan Carroll
Mówiąc o SQL Server, mają one format()funkcję, która pozwoli Ci korzystać format(Column1,'000') as Column2.
Manngo,

Odpowiedzi:

179

Możesz użyć funkcji rpadi lpaddo wprowadzania cyfr odpowiednio w prawo lub w lewo. Zauważ, że to nie działa bezpośrednio na liczbach, więc będziesz musiał ich używać ::charlub ::textrzucać:

SELECT RPAD(numcol::text, 3, '0'), -- Zero-pads to the right up to the length of 3
       LPAD(numcol::text, 3, '0'), -- Zero-pads to the left up to the length of 3
FROM   my_table
Mureinik
źródło
2
@EvanCarroll to jest właściwa odpowiedź - o czym mówisz?
Yarin
@Yarin to odpowiedź jest znormalizowaną metodą wywołania jednej funkcji z ciągami formatującymi. Używając RPAD / LPAD konwertujesz na łańcuchy, a następnie przetwarzasz łańcuchy. Używając to_char, po prostu określasz inną metodę określania łańcuchów.
Evan Carroll
3
@EvanCarroll oba są przydatne - ten pozwala określić liczbę długości ciągu - drugi wymaga znajomości „fm” oznacza tryb wypełnienia i pozwala określić format obrazu
Brian Burns
OSTRZEŻENIE: W przeciwieństwie do klasycznych printf, te funkcje z główką kości po cichu przycinają sznurek do rozmiaru, jeśli nie pasuje. Więc możesz potrzebować case when length(foo) ...wokół tego.
Sam Watkins
62

to_char()Funkcja jest tam numerami format:

select to_char(column_1, 'fm000') as column_2
from some_table;

fmPrefiks ( „trybu napełniania”) zapobiega spacje w powstałych varchar. Po 000prostu określa liczbę cyfr, które chcesz mieć.

psql (9.3.5)
Wpisz „pomoc”, aby uzyskać pomoc.

postgres => z przykładowymi numerami (nr) jako (
postgres (> wartości (1), (11), (100)
postgres (>)
postgres-> wybierz to_char (nr, 'fm000')
postgres-> from sample_numbers;
 to_char
---------
 001
 011
 100
(3 rzędy)

postgres =>

Więcej informacji na temat obrazu formatu można znaleźć w podręczniku:
http://www.postgresql.org/docs/current/static/functions-formatting.html

koń bez imienia
źródło
3
Jeśli liczba jest za długa, to_charkonwertuje ją na ###. Oo
Sam Watkins
1
Jestem ciekawy, czy istnieje rozwiązanie problemu, w którym jeśli # jeśli jest dłuższy niż określony w to_Char, konwertuje się na ###. Czy w ogóle istnieje określona minimalna liczba zer, a następnie rosną z tego większe liczby? Na przykład, jeśli określisz 3 dla lpad, liczby będą miały format 001010 100 .. 1001
mike hennessy