填充前导零的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的一列,那么可以避免投射部分。