Preenchendo zeros à esquerda no postgreSQL

103

Eu sou relativamente novo no PostgreSQL e sei como preencher um número com zeros à esquerda no SQL Server, mas estou lutando para descobrir isso no PostgreSQL.

Tenho uma coluna de números onde o número máximo de dígitos é 3 e o mínimo é 1: se for um dígito, terá dois zeros à esquerda e se for 2 dígitos terá 1, por exemplo, 001, 058, 123.

No SQL Server, posso usar o seguinte:

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

Isso não existe no PostgreSQL. Qualquer ajuda seria apreciada.

Ben
fonte
2
Usando o google é exatamente como encontrei esta página. Foi o meu resultado número um no Google.
Jason
Possível duplicata da função to_char (número) no postgres
Evan Carroll
Falando em SQL Server, eles têm a format()função, que vai deixar você usar format(Column1,'000') as Column2.
Manngo,

Respostas:

179

Você pode usar as funções rpade lpadpara preencher números à direita ou à esquerda, respectivamente. Observe que isso não funciona diretamente com números, então você terá que usá -los ::charou ::textlançá-los:

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
fonte
2
@EvanCarroll esta é a resposta certa - do que você está falando?
Yarin
@Yarin esta resposta é o método padronizado de chamada de função com strings de formato. Usando RPAD / LPAD, você está convertendo em strings e depois processando as strings. Usando to_char, você está apenas especificando um método diferente para stringificar.
Evan Carroll
3
@EvanCarroll ambos são úteis - este permite que você especifique um número para o comprimento da string - o outro requer que 'fm' seja o modo de preenchimento e permite que você especifique um formato de imagem
Brian Burns
AVISO: Ao contrário do clássico printf, essas funções com cabeça de osso cortam silenciosamente sua corda no tamanho certo, se ela não couber. Então, você pode precisar de uma case when length(foo) ...solução.
Sam Watkins
62

A to_char()função existe para formatar números:

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

O fmprefixo ("modo de preenchimento") evita espaços à esquerda no varchar resultante. O 000simplesmente define o número de dígitos que você deseja ter.

psql (9.3.5)
Digite "ajuda" para obter ajuda.

postgres => com sample_numbers (nr) como (
postgres (> valores (1), (11), (100)
postgres (>)
postgres-> selecione to_char (nr, 'fm000')
postgres-> de sample_numbers;
 to_char
---------
 001
 011
 100
(3 linhas)

postgres =>

Para obter mais detalhes sobre o formato de imagem, consulte o manual:
http://www.postgresql.org/docs/current/static/functions-formatting.html

um cavalo sem nome
fonte
2
Se o número for muito longo, to_charconverte-o em ###. Oo
Sam Watkins
Estou curioso para saber se há uma solução para o problema em que se # for maior do que o especificado em to_Char, ele será convertido em ###. Existe alguma maneira de especificar um número mínimo de zeros e ter números maiores crescendo a partir disso? Por exemplo, se você especificar 3 para lpad, os números serão formatados como 001 010 100 .. 1001
mike hennessy