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.


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

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.