559 votes

Pad d'une chaîne de zéros donc ses 3 caractères dans SQL Server 2008

J'ai une chaîne qui est jusqu'à 3 caractères lors de son premier créé dans SQL Server 2008 R2.

Je tiens à compléter avec des zéros, donc si sa valeur d'origine a été '1' alors la nouvelle valeur serait " 001 " Ou si sa valeur d'origine était le '23', la nouvelle valeur est '023' OU si sa valeur d'origine est '124' alors la nouvelle valeur est la même que la valeur d'origine.

Je suis à l'aide de SQL Server 2008 R2. Comment pourrais-je le faire à l'aide de T-SQL?

897voto

Hogan Points 30189

Si le champ est déjà une chaîne, cela fonctionne

 SELECT RIGHT('000'+ISNULL(field,''),3)

Si vous voulez les valeurs null pour montrer que '000'

Il pourrait être un entier -- alors vous voulez

 SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)

35voto

Nicholas Carey Points 24614

Ici est un problème plus général de la technique pour la gauche de rembourrage pour toute largeur désirée:

declare @x     int     = 123 -- value to be padded
declare @width int     = 25  -- desired width
declare @pad   char(1) = '0' -- pad character

select right_justified = replicate(
                           @pad ,
                           @width-len(convert(varchar(100),@x))
                           )
                       + convert(varchar(100),@x)

Toutefois, si vous avez affaire avec des valeurs négatives, et le remplissage avec des zéros à gauche, ni le présent, ni d'autres ont suggéré technique. Vous obtiendrez quelque chose qui ressemble à ceci:

00-123

[Probablement pas ce que vous vouliez]

Donc ... vous aurez à sauter à travers quelques cerceaux supplémentaires Voici une approche qui permettra de formater correctement les nombres négatifs:

declare @x     float   = -1.234
declare @width int     = 20
declare @pad   char(1) = '0'

select right_justified = stuff(
         convert(varchar(99),@x) ,                            -- source string (converted from numeric value)
         case when @x < 0 then 2 else 1 end ,                 -- insert position
         0 ,                                                  -- count of characters to remove from source string
         replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
         )

Il convient de noter que l' convert() des appels devrait spécifier une [n]varchar d'une longueur suffisante pour contenir le résultat converti avec troncature.

6voto

Alan B. Dee Points 1254

Pour ceux qui veulent mettre à jour leurs données existantes voici la requête:

update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5)

4voto

Konstantin Points 36

Pour les entiers, vous pouvez utiliser la conversion implicite de type int varchar:

SELECT RIGHT(1000 + field, 3)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X