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

jp2*_*ode 111 sql t-sql sql-server string-formatting

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

在这里面,我们的员工徽章号码存储为char(6)000001999999.

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

在我的新表,我可以走捷径,并复制旧表,但是我希望有更好的数据传输,更小的尺寸等,通过简单地存储int从价值观1999999.

在C#中,我可以使用快速格式化int徽章编号的值

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

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

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Run Code Online (Sandbox Code Playgroud)

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

Vin*_*zzi 163

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

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId
Run Code Online (Sandbox Code Playgroud)

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

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)
Run Code Online (Sandbox Code Playgroud)

以及删除这些0并获取"真实"数字的代码:

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)
Run Code Online (Sandbox Code Playgroud)

  • 这仅在传入的值是字符串时有效,如果传递的是一个整数,则输出的值与传入的值相同. (2认同)
  • 虽然它的旧...使用"+ convert(varchar,EmployeeID)"而不是"+ EmployeeID"应解决int问题 (2认同)
  • 除非EmployeeId大于6位否则导致NULL结果,这是一种好方法.联系函数的答案是:SELECT CONCAT(REPLICATE('0',6-LEN(CONVERT(varchar,EmployeeId))),EmployeeId) (2认同)

小智 110

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

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 
Run Code Online (Sandbox Code Playgroud)

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

  • 不过,我现在希望看到这个泡沫更接近顶端. (17认同)
  • 以防任何人想知道.`Format`不保留数据类型,但隐式转换为nvarchar:`select sql_variant_property(50,'BaseType'),sql_variant_property(format(50,N'00000'),'BaseType')` (4认同)
  • 这种方式是最简单的恕我直言的最佳解决方案. (2认同)
  • SQL Server 中的“FORMAT”仍然通过调用 .NET 的“IFormattable” API 来实现,这在从 T-SQL 调用时会显着增加性能损失。考虑使用 /sf/answers/666449661/ 中的“REPLICATE”方法。这是 2015 年关于“FORMAT”性能不佳的文章:https://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but (2认同)

Ste*_*eve 31

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

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

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

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


Jef*_*hol 26

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

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

只需确保"1000000"至少具有所需大小的零.


小智 9

从 2012 版开始,您可以使用

SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0
Run Code Online (Sandbox Code Playgroud)


Raj*_*mar 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')
Run Code Online (Sandbox Code Playgroud)


Jam*_*iec 6

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

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)
Run Code Online (Sandbox Code Playgroud)

或者,根据您的查询

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


小智 6

考虑负数而不溢出 6 个字符...

FORMAT(EmployeeID, '000000;-00000')
Run Code Online (Sandbox Code Playgroud)