【问题标题】:How do I convert an int to a zero padded string in T-SQL?如何在 T-SQL 中将 int 转换为零填充字符串?
【发布时间】:2010-09-23 11:25:49
【问题描述】:

假设我有一个值为 1 的 int。如何将该 int 转换为零填充字符串,例如 00000001

【问题讨论】:

标签: sql tsql


【解决方案1】:

另一种方式是:

DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')

【讨论】:

  • 我做到了,它工作了我更多的是询问这些功能如何协同工作,也许问题是为什么没有内置方法
  • 只留下前导空格,删除替换,例如选择 STR(@iVal, 8, 0)
【解决方案2】:
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8

Select Replace(Str(@MyInt, @StrLen), ' ' , '0')

【讨论】:

  • 或者如果给出固定长度,则在运行中:SELECT REPLACE(STR(DATEPART(MONTH,[Date]),2),' ','0')
【解决方案3】:

或者,如果你真的想成为硬核...... ;-)

declare @int int
set @int = 1

declare @string varchar(max)
set @string = cast(@int as varchar(max))

declare @length int
set @length = len(@string)

declare @MAX int
set @MAX = 8

if @length < @MAX
begin
    declare @zeros varchar(8)
    set @zeros = ''

    declare @counter int
    set @counter = 0

    while (@counter < (@MAX - @length))
    begin
        set @zeros = @zeros + '0'
        set @counter = @counter + 1
    end
    set @string = @zeros + @string
end
print @string

【讨论】:

    【解决方案4】:

    如果我想填充到特定的总长度,我会使用 REPLICATE 和 DATALENGTH 函数,如下所示:

    DECLARE @INT INT
    DECLARE @UNPADDED VARCHAR(3)
    DECLARE @PADDED VARCHAR(3)
    
    SET @INT = 2
    SET @UNPADDED = CONVERT(VARCHAR(3),@INT)
    SET @PADDED = REPLICATE('0', 3 - DATALENGTH(@UNPADDED)) + @UNPADDED
    SELECT @INT, @UNPADDED, @PADDED
    

    为了简单起见,我在这里使用了变量,但是您可以看到,您可以指定总字符串的最终长度,而不必担心开头的 INT 的大小,只要它是

    【讨论】:

      【解决方案5】:

      我总是用:

      SET @padded = RIGHT('z0000000000000'
        + convert(varchar(30), @myInt), 8)
      

      z 阻止 SQL 将字符串隐式转换为 int 以进行加法/连接。

      【讨论】:

        【解决方案6】:

        如果 int 可以变为负数,你就有问题了,所以为了解决这个问题,我有时会这样做:

        DECLARE @iVal int 
        set @iVal = -1
            select 
                case 
                    when @ival >= 0 then right(replicate('0',8) + cast(@ival as nvarchar(8)),8)
                    else '-' + right(replicate('0',8) + cast(@ival*-1 as nvarchar(8)),8)
                end
        

        【讨论】:

        • 感谢您了解这个边缘案例。
        【解决方案7】:

        这对我有用:

        SELECT RIGHT('000' + CAST(Table.Field AS VARCHAR(3)),3) FROM Table
        

        ...

        我创建了这个用户函数

        T-SQL 代码:

        CREATE FUNCTION CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(24) AS BEGIN
        
        IF @intlen > 24
           SET @intlen = 24
        
        RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(24),@intVal)))) 
            + CONVERT(nvarchar(24),@intVal) END
        

        例子:

        选择 dbo.CIntToChar(867, 6) 作为 COD_ID

        输出

        000867

        【讨论】:

          【解决方案8】:

          从 SQL Server 2012 开始,您现在可以这样做:

          format(@int, '0000#')
          

          【讨论】:

          • sucky int 的简洁解决方案 :)
          • 性能很糟糕。在我的 300000 行样本中,FORMAT 比 REPLACE(STR(
          【解决方案9】:

          然后是这个,使用 REPLICATE:

          SELECT REPLICATE('0', 7) + '1'
          

          当然,您可以根据需要将文字 7 和 '1' 替换为适当的函数;以上为您提供了示例。例如:

          SELECT REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt)
          

          将用零填充小于 8 位的整数,最多 8 个字符。

          现在,REPLICATE 的第二个参数中的负数将返回 NULL。因此,如果有可能(例如,在上面的示例中,@myInt 可能超过 1 亿个),那么如果字符数超过 8 个,您可以使用 COALESCE 返回不带前导零的数字:

          SELECT COALESCE(REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt), CONVERT(nvarchar, @myInt))
          

          【讨论】:

            【解决方案10】:

            考虑使用“0”填充的非常直接的方法是,如果您将 @_int 固定为 4 位小数,则注入 4 个“0”:

                select RIGHT( '0000'+ Convert(varchar, @_int), 4) as txtnum
            

            ;如果你的固定空间是 3,你注入 3'0's

                select RIGHT( '000'+ Convert(varchar, @_int), 3) as txtnum
            

            ;下面我注入 '00' 为每个 bldg 生成 99 个标签

            declare @_int int
            set @_int = 1
            while @_int < 100 Begin
                select BldgName + '.Floor_' + RIGHT( '00'+ Convert(varchar, @_int), 2) 
                + '.balcony' from dbo.tbl_FloorInfo group by BldgName
                set @_int = @_int +1
            End
            

            结果是:

                'BldgA.Floor_01.balcony'
                'BldgB.Floor_01.balcony'
                'BldgC.Floor_01.balcony'
                 ..
                 ..
                'BldgA.Floor_10.balcony'
                'BldgB.Floor_10.balcony'
                'BldgC.Floor_10.balcony'
                 ..
                 ..
                 ..
                'BldgA.Floor_99.balcony'
                'BldgB.Floor_99.balcony'
                'BldgC.Floor_99.balcony'
            

            【讨论】:

              【解决方案11】:

              我认为 Charles Bretana 的答案是最简单和最快的。不使用STR 的类似解决方案是:

              SELECT REPLACE(REVERSE(
                      CONVERT(CHAR(5 /*<= Target length*/)
                              , REVERSE(CONVERT(VARCHAR(100), @MyInt)))
                   ), ' ', '0')
              

              【讨论】:

                【解决方案12】:

                使用FORMAT(&lt;your number&gt;,'00000000') 使用尽可能多的零,以便在最终结果中包含数字。

                Here is official documentation of the FORMAT function

                【讨论】:

                  猜你喜欢
                  • 2011-05-18
                  • 2011-07-01
                  • 2012-02-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-10-26
                  • 2014-03-18
                  • 2019-04-16
                  • 2020-03-23
                  相关资源
                  最近更新 更多