Padding nol ke kiri di postgreSQL

103

Saya relatif baru mengenal PostgreSQL dan saya tahu cara memasukkan angka dengan angka nol ke kiri di SQL Server tetapi saya kesulitan untuk mencari tahu di PostgreSQL.

Saya memiliki kolom angka di mana jumlah digit maksimumnya adalah 3 dan minnya adalah 1: jika itu satu digit, ia memiliki dua angka nol di sebelah kiri, dan jika itu 2 digit ia memiliki 1, misalnya 001, 058, 123.

Di SQL Server saya dapat menggunakan berikut ini:

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

Ini tidak ada di PostgreSQL. Bantuan apa pun akan dihargai.

Ben
sumber
2
Menggunakan google persis seperti yang saya temukan halaman ini. Itu adalah hasil google nomor satu saya.
Jason
Kemungkinan duplikat fungsi to_char (angka) di postgres
Evan Carroll
Berbicara tentang SQL Server, mereka memiliki format()fungsi yang memungkinkan Anda menggunakannya format(Column1,'000') as Column2.
Manngo

Jawaban:

179

Anda dapat menggunakan fungsi rpaddan lpaduntuk memasukkan nomor ke kanan atau ke kiri. Perhatikan bahwa ini tidak bekerja secara langsung pada angka, jadi Anda harus menggunakan ::charatau ::textmentransmisikannya:

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
sumber
2
@EvanCarroll ini adalah jawaban yang benar- apa yang kamu bicarakan?
Yarin
@Yarin jawaban ini adalah metode panggilan fungsi satu standar dengan string format. Menggunakan RPAD / LPAD Anda mengonversi menjadi string dan kemudian memproses string. Menggunakan to_char, Anda hanya menentukan metode yang berbeda untuk merangkai.
Evan Carroll
3
@EvanCarroll keduanya berguna - yang satu ini memungkinkan Anda menentukan nomor untuk panjang string - yang lain mengharuskan mengetahui 'fm' adalah singkatan dari mode isian dan memungkinkan Anda menentukan format gambar
Brian Burns
PERINGATAN: Tidak seperti yang klasik printf, fungsi tulang kepala ini akan memotong senar Anda secara diam-diam sesuai ukuran jika tidak pas. Jadi, Anda mungkin membutuhkannya case when length(foo) ....
Sam Watkins
62

Ada to_char()fungsinya untuk memformat angka:

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

The fmawalan ( "fill mode") menghindari spasi terkemuka di varchar yang dihasilkan. Ini 000hanya menentukan jumlah digit yang ingin Anda miliki.

psql (9.3.5)
Ketik "bantuan" untuk mendapatkan bantuan.

postgres => dengan sample_numbers (nr) sebagai (
postgres (> nilai (1), (11), (100)
postgres (>)
postgres-> pilih to_char (nr, 'fm000')
postgres-> dari sample_numbers;
 to_char
---------
 001
 011
 100
(3 baris)

postgres =>

Untuk detail lebih lanjut tentang gambar format, silakan lihat manual:
http://www.postgresql.org/docs/current/static/functions-formatting.html

seekor kuda tanpa nama
sumber
2
Jika angkanya terlalu panjang, to_charubah menjadi ###. Oo
Sam Watkins
Saya ingin tahu apakah ada solusi untuk masalah di mana jika # jika lebih lama dari yang ditentukan dalam to_Char, itu akan diubah menjadi ###. Apakah ada cara untuk menentukan minimal # nol dan kemudian memiliki angka yang lebih besar tumbuh dari itu? Misalnya, jika Anda menentukan 3 untuk lpad, format angka akan menjadi 001 010 100 .. 1001
mike hennessy