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

问题描述 投票:0回答:15

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

其中,我们的员工徽章号码存储为从

char(6)
000001
999999

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

在我的新表中,我可以走捷径并复制旧表,但我希望通过简单地将

int
值从
1
存储到
999999
来实现更好的数据传输、更小的尺寸等。

在 C# 中,我可以使用

 快速格式化徽章编号的 
int

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

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

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

如果

EmployeeID
是 7135,则此查询应返回
007135

sql sql-server t-sql string-formatting
15个回答
227
投票

将数字 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)

210
投票

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

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

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


37
投票

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

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

但是,这假设您的

EmployeeID
是一个数值,并且此代码将结果更改为字符串,我建议再次添加原始数值

编辑 当然我没有仔细阅读上面的问题。它表示该字段是

char(6)
,因此 EmployeeID 不是数值。虽然这个答案本身仍然有价值,但它不是上述问题的正确答案。


28
投票

讨厌必须转换 int,这看起来简单得多。甚至可能表现得更好,因为只有一次字符串转换和简单的加法。

选择 RIGHT(1000000 + 员工 ID, 6) ...

只需确保“1000000”至少有所需大小的零个数。


15
投票

我将所有内容发布在一个地方,所有内容都适合我用 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')

10
投票

从2012版本起您可以使用

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

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
投票

在不溢出 6 个字符的情况下计算负数...

FORMAT(EmployeeID, '000000;-00000')

4
投票

尽可能干净并给出用变量替换的范围:

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

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

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

1
投票

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

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

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

1
投票

最简单的永远是最好的:

Select EmployeeID*1 as EmployeeID 

0
投票

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

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

0
投票

如果 Employee Id 的长度大于 6,这将给出 EmployeeId 的前六个字符。另外,这将留下 EmployeeId 如果 EmployeeId 的长度小于 6,则为零。

Select REPLICATE('0',6-LEN(RTRIM(Left(EmployeeId, 6)))) + RTRIM(Left(EmployeeId, 6))
© www.soinside.com 2019 - 2024. All rights reserved.