Riempimento di zeri a sinistra in postgreSQL


103

Sono relativamente nuovo in PostgreSQL e so come riempire un numero con zeri a sinistra in SQL Server, ma faccio fatica a capirlo in PostgreSQL.

Ho una colonna numerica in cui il numero massimo di cifre è 3 e il minimo è 1: se è una cifra ha due zeri a sinistra, e se è 2 cifre ha 1, ad esempio 001, 058, 123.

In SQL Server posso utilizzare quanto segue:

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

Questo non esiste in PostgreSQL. Qualsiasi aiuto sarebbe apprezzato.


2
Usare Google è esattamente come ho trovato questa pagina. È stato il mio risultato numero uno su Google.
Jason

Possibile duplicato della funzione to_char (numero) in postgres
Evan Carroll,

Parlando di SQL Server, hanno la format()funzione, che ti permetterà di usare format(Column1,'000') as Column2.
Manngo

Risposte:


179

È possibile utilizzare le funzioni rpade lpadper inserire i numeri rispettivamente a destra o a sinistra. Nota che questo non funziona direttamente sui numeri, quindi dovrai usarli ::charo ::texttrasmetterli:

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 questa è la risposta giusta, di cosa stai parlando?
Yarin

@Yarin questa risposta è il metodo di chiamata di una funzione standardizzato con stringhe di formato. Usando RPAD / LPAD stai convertendo in stringhe e poi elaborando le stringhe. Usando to_char, stai solo specificando un metodo diverso per la stringa.
Evan Carroll

3
@EvanCarroll sono entrambi utili - questo ti consente di specificare un numero per la lunghezza della stringa - l'altro richiede di sapere che 'fm' sta per modalità di riempimento e ti consente di specificare un'immagine in formato
Brian Burns

ATTENZIONE: a differenza del classico printf, queste funzioni a testa ossea taglieranno silenziosamente la tua corda se non si adatta. Quindi potresti aver bisogno di un case when length(foo) ...intorno.
Sam Watkins

62

La to_char()funzione è lì per formattare i numeri:

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

Il fmprefisso ("modalità di riempimento") evita gli spazi iniziali nel varchar risultante. Il 000definisce semplicemente il numero di cifre che vuoi avere.

psql (9.3.5)
Digita "help" per chiedere aiuto.

postgres => con sample_numbers (nr) come (
postgres (> valori (1), (11), (100)
postgres (>)
postgres-> seleziona to_char (nr, 'fm000')
postgres-> da sample_numbers;
 to_char
---------
 001
 011
 100
(3 righe)

Postgres =>

Per maggiori dettagli sull'immagine in formato, consultare il manuale:
http://www.postgresql.org/docs/current/static/functions-formatting.html


2
Se il numero è troppo lungo, lo to_charconverte in ###. Oo
Sam Watkins

Sono curioso di sapere se esiste una soluzione al problema in cui se # se più lungo di quanto specificato in to_Char, viene convertito in ###. C'è comunque un numero minimo specifico di zeri e quindi numeri più grandi crescono da quello? Ad esempio, se specifichi 3 per lpad, i numeri verranno formattati come 001 010 100 .. 1001
mike hennessy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.