通过在SQL Server中使用前导零填充来格式化数字

时间:2012-03-01 17:07:36

标签: sql sql-server tsql string-formatting

我们有一个旧的SQL表,SQL Server 2000使用了近10年。

其中,我们的员工徽章编号存储为char(6) 000001999999

我现在正在编写一个Web应用程序,我需要存储员工徽章编号。

在我的新表中,我可以采用捷径并复制旧表,但我希望通过简单地存储来自int的{​​{1}}值来实现更好的数据传输,更小的尺寸等到1

在C#中,我可以使用

快速格式化徽章编号的999999
int

如何修改这个简单的SQL查询以格式化返回的值?

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

如果SELECT EmployeeID FROM dbo.RequestItems WHERE ID=0 为7135,则此查询应返回EmployeeID

13 个答案:

答案 0 :(得分:158)

将数字6更改为您需要的总长度:

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

如果列是INT,则可以使用RTRIM将其隐式转换为VARCHAR

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

删除这些0并获取“真实”数字的代码:

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

答案 1 :(得分:100)

只需使用FORMAT功能(适用于SQL Server 2012或更高版本):

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

参考:http://msdn.microsoft.com/en-us/library/hh213505.aspx

答案 2 :(得分:30)

您可以通过这种方式更改程序

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

但是,假设您的EmployeeID是一个数值,此代码会将结果更改为字符串,我建议再次添加原始数值

编辑当然,我没有仔细阅读上述问题。它表示该字段是char(6),因此EmployeeID不是数值。虽然这个答案本身仍然有价值,但它不是上述问题的正确答案。

答案 3 :(得分:24)

讨厌必须CONVERT int,这似乎更简单。甚至可能表现更好,因为只有一个字符串转换和简单的添加。

选择 RIGHT(1000000 + EmployeeId,6)...

确保" 1000000"至少有所需大小的零。

答案 4 :(得分:9)

我在一个地方发布所有内容,所有内容都适合我用4个前导零填充:)

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')

答案 5 :(得分:6)

另一种方式,只是为了完整。

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

或者,根据您的查询

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

答案 6 :(得分:4)

尽可能干净,并用变量替换范围:

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

答案 7 :(得分:4)

从版本2012开始,您可以使用

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

答案 8 :(得分:3)

SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0

答案 9 :(得分:2)

SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0

答案 10 :(得分:1)

对于所有Sql版本,该解决方案适用于带有前导零的带符号/负数:

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

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

答案 11 :(得分:1)

最简单的总是最好的:

Select EmployeeID*1 as EmployeeID 

答案 12 :(得分:-1)

在我的SQL版本中,我无法使用REPLICATE。所以我这样做了:

SELECT 
    CONCAT(REPEAT('0', 6-LENGTH(emplyeeID)), emplyeeID) AS emplyeeID 
FROM 
    dbo.RequestItems`