web-dev-qa-db-fra.com

Formater des nombres en ajoutant des zéros dans SQL Server

Nous avons une ancienne table SQL utilisée par SQL Server 2000 depuis près de 10 ans.

Les numéros de badge de nos employés sont stockés sous la forme char(6) de 000001 à 999999.

J'écris actuellement une application Web et je dois stocker les numéros de badge des employés.

Dans ma nouvelle table, je pouvais prendre le raccourci et copier l'ancienne table, mais j'espère un meilleur transfert de données, une taille plus petite, etc., en stockant simplement les valeurs int de 1 à 999999.

En C #, je peux rapidement formater une valeur int pour le numéro de badge à l'aide de

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

Comment pourrais-je modifier cette requête SQL simple pour formater également la valeur renvoyée?

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

Si EmployeeID vaut 7135, cette requête doit renvoyer 007135.

108
jp2code

Modifiez le nombre 6 en fonction de votre longueur totale requise:

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId

Si la colonne est une INT, vous pouvez utiliser RTRIM pour la convertir implicitement en VARCHAR.

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)

Et le code pour supprimer ces 0 et récupérer le "vrai" numéro:

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)
161
Vince Pergolizzi

Utilisez simplement la fonction FORMAT (fonctionne sur SQL Server 2012 ou une version plus récente):

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 

Référence: http://msdn.Microsoft.com/en-us/library/hh213505.aspx

102
EdMorte

Vous pouvez changer votre procédure de cette façon

SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, 
       EmployeeID
FROM dbo.RequestItems 
WHERE ID=0 

Cependant, cela suppose que votre EmployeeID soit une valeur numérique et que ce code modifie le résultat en chaîne, je suggère d'ajouter à nouveau la valeur numérique d'origine.

EDIT Bien sûr, je n'ai pas lu attentivement la question ci-dessus. Il indique que le champ est un char(6) alors que EmployeeID n'est pas une valeur numérique. Bien que cette réponse ait toujours une valeur en soi, ce n’est pas la bonne réponse à la question ci-dessus.

30
Steve

Je détestais avoir à convertir le int, et cela semble beaucoup plus simple. Peut-être même mieux fonctionner puisqu'il n'y a qu'une conversion de chaîne et une simple addition.

sélectionnez RIGHT (1000000 + EmployeeId, 6) ...

Assurez-vous simplement que le "1000000" contient au moins autant de zéros que la taille requise.

24
JeffSahol

Je poste tout au même endroit, tout fonctionne pour moi de remplir avec 4 premiers zéro :)

declare @number int =  1;
print right('0000' + cast(@number as varchar(4)) , 4)
print right('0000' + convert(varchar(4), @number) , 4)
print right(replicate('0',4) + convert(varchar(4), @number) , 4)
print  cast(replace(str(@number,4),' ','0')as char(4))
print format(@number,'0000')
9
Raj kumar

Une autre façon, juste pour être complet.

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)

Ou, selon votre requête

SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) 
         AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0
6
Jamiec

Aussi propre que possible et donnant la possibilité de remplacer par des variables:

Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0
4
Divanshu

À partir de la version 2012, vous pouvez utiliser

SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0
4
Hagop Simonian
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0
3
Jimbo
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0
2
user1227804

La solution fonctionne pour les nombres signés/négatifs avec des zéros non significatifs, pour toutes les versions de SQL:

DECLARE
    @n money = -3,
    @length tinyint = 15,
    @decimals tinyint = 0

SELECT REPLICATE('-', CHARINDEX('-', @n, 1)) + REPLACE(REPLACE(str(@n, @length, @decimals), '-', ''), ' ', '0')
1
Zsolt v