Relleno de ceros a la izquierda en postgreSQL

103

Soy relativamente nuevo en PostgreSQL y sé cómo rellenar un número con ceros a la izquierda en SQL Server, pero estoy luchando por resolver esto en PostgreSQL.

Tengo una columna numérica donde el número máximo de dígitos es 3 y el mínimo es 1: si es un dígito tiene dos ceros a la izquierda, y si es 2 dígitos tiene 1, por ejemplo, 001, 058, 123.

En SQL Server puedo usar lo siguiente:

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

Esto no existe en PostgreSQL. Cualquier ayuda sería apreciada.

Ben
fuente
2
Usar google es exactamente como encontré esta página. Fue mi resultado número uno en Google.
Jason
Posible duplicado de la función to_char (número) en postgres
Evan Carroll
Hablando de SQL Server, tienen la format()función que te permitirá usar format(Column1,'000') as Column2.
Manngo

Respuestas:

179

Puede utilizar las funciones rpady lpadpara rellenar números hacia la derecha o hacia la izquierda, respectivamente. Tenga en cuenta que esto no funciona directamente con los números, por lo que tendrá que usarlos ::charo ::textlanzarlos:

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
fuente
2
@EvanCarroll esta es la respuesta correcta, ¿de qué estás hablando?
Yarin
@Yarin esta respuesta es el método estandarizado de llamada a una función con cadenas de formato. Usando RPAD / LPAD, está convirtiendo a cadenas y luego procesando las cadenas. Usando to_char, solo está especificando un método diferente para la cadena.
Evan Carroll
3
@EvanCarroll ambos son útiles: este le permite especificar un número para la longitud de la cadena; el otro requiere saber que 'fm' significa modo de relleno y le permite especificar una imagen de formato
Brian Burns
ADVERTENCIA: A diferencia del clásico printf, estas funciones de cabeza de hueso cortarán silenciosamente su cuerda al tamaño si no encaja. Por lo que es posible que necesite una case when length(foo) ...solución.
Sam Watkins
62

La to_char()función está ahí para formatear números:

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

El fmprefijo ("modo de relleno") evita los espacios iniciales en el varchar resultante. los000 simplemente define el número de dígitos que desea tener.

psql (9.3.5)
Escriba "ayuda" para obtener ayuda.

postgres => con sample_numbers (nr) como (
postgres (> valores (1), (11), (100)
postgres (>)
postgres-> seleccionar to_char (nr, 'fm000')
postgres-> from sample_numbers;
 to_char
---------
 001
 011
 100
(3 filas)

postgres =>

Para obtener más detalles sobre el formato de imagen, consulte el manual:
http://www.postgresql.org/docs/current/static/functions-formatting.html

un caballo sin nombre
fuente
2
Si el número es demasiado largo, lo to_charconvierte a ###. Oo
Sam Watkins
Tengo curiosidad por saber si hay una solución al problema en el que si # si es más largo de lo especificado en to_Char, se convierte en ###. ¿Hay alguna forma de especificar un número mínimo de ceros y luego aumentar los números a partir de eso? Por ejemplo, si especifica 3 para lpad, los números se formatearán como 001 010100 .. 1001
mike hennessy