Remplir les zéros à gauche dans PostgreSQL

103

Je suis relativement nouveau dans PostgreSQL et je sais comment ajouter des zéros à gauche dans SQL Server, mais j'ai du mal à comprendre cela dans PostgreSQL.

J'ai une colonne numérique où le nombre maximum de chiffres est de 3 et le min est de 1: si c'est un chiffre, il a deux zéros à gauche, et si c'est 2 chiffres, il en a 1, par exemple 001, 058, 123.

Dans SQL Server, je peux utiliser les éléments suivants:

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

Cela n'existe pas dans PostgreSQL. Toute aide serait appréciée.

Ben
la source
2
Utiliser google, c'est exactement comme ça que j'ai trouvé cette page. C'était mon résultat Google numéro un.
Jason
Possible duplication de la fonction to_char (number) dans postgres
Evan Carroll
En parlant de SQL Server, ils ont la format()fonction, qui vous permettra d'utiliser format(Column1,'000') as Column2.
Manngo

Réponses:

179

Vous pouvez utiliser les fonctions rpadet lpadpour insérer des numéros vers la droite ou vers la gauche, respectivement. Notez que cela ne fonctionne pas directement sur les nombres, vous devrez donc les utiliser ::charou ::textles cast:

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
la source
2
@EvanCarroll c'est la bonne réponse - de quoi parlez-vous?
Yarin
@Yarin cette réponse est la méthode d'appel de fonction standardisée avec des chaînes de format. En utilisant RPAD / LPAD, vous convertissez en chaînes, puis vous traitez les chaînes. En utilisant to_char, vous spécifiez simplement une méthode différente pour la stringification.
Evan Carroll
3
@EvanCarroll ils sont tous les deux utiles - celui-ci vous permet de spécifier un nombre pour la longueur de la chaîne - l'autre nécessite de savoir que `` fm '' représente le mode de remplissage et vous permet de spécifier un format d'image
Brian Burns
AVERTISSEMENT: contrairement au classique printf, ces fonctions à tête osseuse couperont silencieusement votre corde à la taille si elle ne rentre pas. Vous pourriez donc avoir besoin d'un case when length(foo) ...autour.
Sam Watkins
62

La to_char()fonction est là pour formater les nombres:

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

Le fmpréfixe ("fill mode") évite les espaces de début dans le varchar résultant. Le 000définit simplement le nombre de chiffres que vous souhaitez avoir.

psql (9.3.5)
Tapez "aide" pour obtenir de l'aide.

postgres => avec sample_numbers (nr) as (
postgres (> valeurs (1), (11), (100)
postgres (>)
postgres-> sélectionnez to_char (nr, 'fm000')
postgres-> from sample_numbers;
 to_char
---------
 001
 011
 100
(3 rangées)

postgres =>

Pour plus de détails sur l'image du format, veuillez consulter le manuel:
http://www.postgresql.org/docs/current/static/functions-formatting.html

un cheval sans nom
la source
2
Si le nombre est trop long, le to_charconvertit en ###. Oo
Sam Watkins
Je suis curieux de savoir s'il existe une solution au problème où si # est plus long que spécifié dans to_Char, il se convertit en ###. Y a-t-il de toute façon un nombre minimum de zéros spécifique et ensuite faire croître des nombres plus grands à partir de cela? Par exemple, si vous spécifiez 3 pour lpad, les nombres seront au format
001010