填充带有前导零的字符串,因此在SQL Server 2008中它的长度为3个字符

时间:2013-05-26 15:47:13

标签: sql sql-server tsql

我在SQL Server 2008 R2中首次创建一个长达3个字符的字符串。

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

我正在使用SQL Server 2008 R2。我如何使用T-SQL执行此操作?

18 个答案:

答案 0 :(得分:564)

如果该字段已经是字符串,则可以使用

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

如果您希望空值显示为'000'

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

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

根据问题的要求,这个答案只有在长度< = 3时才有效,如果你想要更大的东西,你需要更改字符串常量,将两个整数常量更改为所需的宽度。例如'0000' and VARCHAR(4)),4

答案 1 :(得分:106)

虽然问题出在SQL Server 2008 R2上,但是如果有人在使用2012及更高版本阅读此内容,那么使用FORMAT会变得更容易。

您可以传递standard numeric format stringcustom numeric format string作为格式参数(感谢Vadim Ovchinnikov获取此提示)。

对于这个问题,例如像

这样的代码
DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');

输出

001
001

答案 2 :(得分:84)

安全方法:

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

这有利于返回字符串'***'以获得n< 0或n> 999,这是一个很好的,明显的越界输入指标。此处列出的其他方法将通过将输入截断为3个字符的子字符串而无声地失败。

答案 3 :(得分:29)

这是一种更为通用的左填充到任何所需宽度的技术:

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)

但是,如果你正在处理负值,并且使用前导零填充,那么这个或其他建议的技术都不会起作用。你会得到这样的东西:

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来保存转换结果并截断。

答案 4 :(得分:24)

以下是我在SQL Server Express 2012中使用的Hogan答案的变体:

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

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

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

答案 5 :(得分:16)

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

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

答案 6 :(得分:12)

使用适合各种情况的此功能。

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 

答案 7 :(得分:5)

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

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

答案 8 :(得分:3)

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

SELECT RIGHT(1000 + field, 3)

答案 9 :(得分:2)

我知道它的旧票我只是想分享它。

我发现此代码正在寻找解决方案。不确定它是否适用于所有版本的MSSQL我都有MSSQL 2016。

declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero

返回&#34; 0023&#34; STR函数中的4是包括值的总长度。示例4,23和123将在STR中都有4个并且将添加正确数量的零。你可以增加或减少它。无需在23上获得长度。

编辑:我认为它与@Anon post相同。

答案 10 :(得分:1)

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

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

如果输入也是varchar列,则可以避免使用转换部分。

答案 11 :(得分:1)

写这个因为我有特定长度的要求(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

返回1234input

答案 12 :(得分:0)

对于更动态的方法,请尝试此操作。

declare @val varchar(5)
declare @maxSpaces int
set @maxSpaces = 3
set @val = '3'
select concat(REPLICATE('0',@maxSpaces-len(@val)),@val)

答案 13 :(得分:0)

尝试固定长度。

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

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

答案 14 :(得分:0)

我创建了此函数,该函数可满足bigint和一个前导零或其他单个字符(最多返回20个字符)的要求,并且结果的长度小于输入数字的长度:

create FUNCTION fnPadNum (
  @Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Pads bigint with leading 0's
            --Sample:  "select dbo.fnPadNum(201,5,'0')" returns "00201"
            --Sample:  "select dbo.fnPadNum(201,5,'*')" returns "**201"
            --Sample:  "select dbo.fnPadNum(201,5,' ')" returns "  201"
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Usage:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')

答案 15 :(得分:0)

我专门来这里研究如何将我的timezoneoffset转换为时区字符串,以便在SQL Server 2008中将日期转换为DATETIMEOFFSET。总的来说,但这是必需的。

因此,我需要一种可以处理负数和正数的方法,如果需要,可以将它们格式化为以零开头的两个字符。 Anons answer让我接近,但是负时区值显示为0-5,而不是必需的-05

因此,对他的答案进行一些调整后,该方法适用于所有时区小时转换

DECLARE @n INT = 13 -- Works with -13, -5, 0, 5, etc
SELECT CASE 
    WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0') 
    ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'

答案 16 :(得分:0)

我希望这是有帮助的,但它可能会偏离主题。我一直在寻找一种解决方案来添加前缀示例“PQC-0”并同时在我的自动增量 ID 前导零。

SELECT LPAD((SELECT CONCAT('000',(CAST(field AS CHAR)))),10,"PQC-0") AS ID FROM table

SELECT CONCAT("000",(SELECT LPAD((CAST(id AS CHAR)),6,"0"))) FROM table

答案 17 :(得分:-1)

简单就是

像:

DECLARE @DUENO BIGINT
SET @DUENO=5

SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO