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.


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

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.