填充前导零的string,所以它在SQL Server 2008中的长度是3个字符

在SQL Server 2008 R2中首次创build时,我有一个长达3个字符的string。

我想填充前导零,所以如果它的原始值是'1',那么新的值就是'001'。 或者如果其原始值是“23”,则新值是“023”。 或者如果它的原始值是'124',那么新值与原始值相同。

我正在使用SQL Server 2008 R2。 我将如何使用T-SQL来做到这一点?

如果该字段已经是一个string,这将工作

SELECT RIGHT('000'+ISNULL(field,''),3) 

如果您希望空值显示为“000”

它可能是一个整数 – 那么你会想要的

  SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3) 

虽然这个问题是针对SQL Server 2008 R2的,但如果有人正在阅读2012版本以上的版本,那么使用FORMAT就会变得更容易。

对于这个问题,例如一个代码

 DECLARE @myInt INT = 1; PRINT FORMAT(@myInt,'00#'); 

输出“001”

下面是一个更通用的技术,用于填充任何所需的宽度:

 declare @x int = 123 -- value to be padded declare @width int = 25 -- desired width declare @pad char(1) = '0' -- pad character select right_justified = replicate( @pad , @width-len(convert(varchar(100),@x)) ) + convert(varchar(100),@x) 

但是,如果您正在处理负值,并使用前导零填充,则不会有其他build议的技巧。 你会得到这样的东西:

 00-123 

[可能不是你想要的]

所以…你将不得不跳过一些额外的箍这里有一个方法,将正确格式负数:

 declare @x float = -1.234 declare @width int = 20 declare @pad char(1) = '0' select right_justified = stuff( convert(varchar(99),@x) , -- source string (converted from numeric value) case when @x < 0 then 2 else 1 end , -- insert position 0 , -- count of characters to remove from source string replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted ) 

应该注意的是, convert()调用应该指定一个足够长度的[n]varchar来保存带截断的转换结果。

安全的方法:

 SELECT REPLACE(STR(n,3),' ','0') 

这样做的好处是返回string'***'为n <0或n> 999,这是一个不错的和明显的越界input指标。 这里列出的其他方法将通过截断input为3个字符的子string静静地失败。

我总是发现以下方法非常有帮助。

 REPLICATE('0', 5 - LEN(Job.Number)) + CAST(Job.Number AS varchar) as 'NumberFull' 

下面是我在SQL Server Express 2012中使用的Hogan答案的一个变种:

 SELECT RIGHT(CONCAT('000', field), 3) 

不用担心字段是否是string,我只是CONCAT它,因为它会输出一个string。 此外,如果该字段可以是NULL ,则可能需要使用ISNULL来避免函数获得NULL结果。

 SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3) 

使用这个适合每种情况的function。

 CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint) RETURNS VARCHAR(250) AS BEGIN DECLARE @NumStr VARCHAR(250) SET @NumStr = LTRIM(@input) IF(@pad > LEN(@NumStr)) SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr; RETURN @NumStr; END 

示例输出

 SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016 SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016 SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016 SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016 

对于整数,你可以使用从int到varchar的隐式转换:

 SELECT RIGHT(1000 + field, 3) 

对于那些想要更新其现有数据的人来说,查询是:

 update SomeEventTable set eventTime=RIGHT('00000'+ISNULL(eventTime, ''),5) 

写这个,因为我有要求达到一个特定的长度(9)。 当input需要填充时,只用@pattern填充左边。 应该总是返回@pattern中定义的长度。

 declare @charInput as char(50) = 'input' --always handle NULL :) set @charInput = isnull(@charInput,'') declare @actualLength as int = len(@charInput) declare @pattern as char(50) = '123456789' declare @prefLength as int = len(@pattern) if @prefLength > @actualLength select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength) else select @charInput 

返回1234input

当我需要固定大小的varchar(或string)输出时,我有整数列作为input类似的问题。 例如,1到'01',12到'12'。 此代码工作:

 SELECT RIGHT(CONCAT('00',field::text),2) 

如果input也是varchar的一列,那么可以避免投射部分。