我有一个最多3个字符长的字符串,当它第一次创建在SQL Server 2008 R2。

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

我使用的是SQL Server 2008 R2。如何使用T-SQL做到这一点?


当前回答

用固定长度的方法试试。

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

其他回答

用固定长度的方法试试。

select right('000000'+'123',5)

select REPLICATE('0', 5 - LEN(123)) + '123'

当我需要固定大小的varchar(或字符串)输出时,我用整数列作为输入有类似的问题。例如,1到'01',12到'12'。这段代码工作:

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

如果输入也是varchar的列,则可以避免强制转换部分。

安全方法:

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

这样做的好处是,对于n < 0或n > 999返回字符串'***',这是一个很好的、很明显的越界输入指示器。这里列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败。

写这个是因为我有一个特定的长度要求(9)。 仅当输入需要填充时,才使用@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

1234年返回输入

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

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

而不是担心字段是否是字符串,我只是CONCAT它,因为它无论如何都会输出一个字符串。此外,如果字段可以为NULL,则可能需要使用ISNULL来避免函数得到NULL结果。

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