143 votes

Fonction PadLeft en T-SQL

J'ai le tableau A suivant :

id
----
1
2
12
123
1234

J'ai besoin de mettre à gauche le id les valeurs avec des zéros :

id
----
0001
0002
0012
0123
1234

Comment puis-je y parvenir ?

219voto

Patrick Points 3083

Je crois que c'est peut-être ce que vous cherchez :

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

o

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

Je n'ai pas testé la syntaxe du deuxième exemple. Je ne suis pas sûr que cela fonctionne à 100% - cela peut nécessiter quelques ajustements - mais cela donne l'idée générale de la façon d'obtenir le résultat souhaité.

EDIT

Pour répondre aux préoccupations énumérées dans les commentaires...

@pkr298 - Oui, STR ne fonctionne que sur les nombres... Le champ de l'OP est un ID... donc un nombre seulement.

@Desolator - Bien sûr, cela ne fonctionnera pas... le premier paramètre est composé de 6 caractères. Vous pouvez faire quelque chose comme :

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

ceci devrait théoriquement déplacer les poteaux de but... comme le nombre devient plus grand il devrait TOUJOURS fonctionner.... indépendamment de si c'est 1 ou 123456789....

Ainsi, si votre valeur maximale est 123456... vous verrez 0000123456 et si votre valeur minimale est 1, vous verrez 0000000001.

4 votes

STR() ne fonctionne que sur les nombres (ou les nombres dans les champs de type chaîne). Ce code ne fonctionne pas si vous l'utilisez sur un champ Varchar que vous supposez contenir un nombre, mais qu'un des enregistrements contient des données incorrectes (non numériques). La fonction RIGHT() ne s'arrête pas dans ce cas.

1 votes

La fonction STR() ne fonctionnera pas si le nombre est d'une longueur supérieure (par ex. STR(123456, 4) retournera ****

2 votes

@Desolator J'ai ajouté une réponse et un correctif pour faciliter le scénario que vous avez ajouté.

70voto

Marcelo Myara Points 447

Vieux poste, mais peut-être que cela aidera quelqu'un :

A compléter jusqu'à ce qu'il se retrouve avec 4 caractères non-blancs :

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

Pour compléter jusqu'à 10 :

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

Si la colonne est numérique convertissez-le d'abord en varchar avec ce code :

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

Et pour compléter jusqu'à 10 avec un champ numérique :

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;

1 votes

@SilverM-A, il n'est pas utile d'ajouter des 0 avant un nombre, puisqu'ils seront de toute façon ignorés (0003 est 3 après tout). Ce que vous voulez probablement faire, c'est convertir ce nombre en une chaîne (varchar), puis utiliser l'instruction ci-dessus.

1 votes

@SilverM-A, si c'est le cas, il suffit de le convertir en utilisant la commande "CAST" comme suit : SELECT RIGHT('0000000000'+CAST(COLUMNNAME AS VARCHAR), 10) FROM TABLENAME ; C'est ça ?

0 votes

@MarceloMyara cela devrait faire partie de la réponse, pas seulement un commentaire. Je l'ai moi-même ajouté.

62voto

Mikael Eriksson Points 77190
declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

Résultat

----
0001
0002
0012
0123
1234

1 votes

13voto

aporia Points 101

Essayez ça :

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]

1voto

Bob Lokerse Points 46

J'en avais besoin dans une fonction sur le serveur SQL et j'ai un peu modifié la réponse de Patrick.

declare @dossierId int = 123
declare @padded_id varchar(7)

set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

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