代码之家  ›  专栏  ›  技术社区  ›  chauncey

如何将int转换为带前导零的char?

  •  84
  • chauncey  · 技术社区  · 7 年前

    我需要将int datafield转换为带前导零的nvarchar

    例子:

    1转换为“001”

    867转换为“000867”等。

    谢谢。


    这是我4小时后的回复…

    我测试了这个t-sql脚本,对我来说很好!

    DECLARE @number1 INT, @number2 INT
    
    SET @number1 = 1
    
    SET @number2 = 867
    
    SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED
    
    SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED
    

    我创建了这个用户函数

    T-SQL代码:

    CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
    AS
    BEGIN
    
        -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number
    
        -- @intlen contains the string size to return
        IF @intlen > 20
           SET @intlen = 20
    
        RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal)))) 
            + CONVERT(nvarchar(20),@intVal)
    
    END
    

    例子:

    选择dbo.cinttochar(867,6)作为cod\u id

    产量

    000867

    16 回复  |  直到 8 年前
        1
  •  85
  •   Nguyen Tran    14 年前

    试试这个: select right('00000' + cast(Your_Field as varchar(5)), 5)

    它将得到5位数的结果,例如:00001,…,01234

        2
  •  46
  •   Darek.K    13 年前

    你也可以使用 格式() 引入的功能 SQL Server 2012版 . http://technet.microsoft.com/library/hh213505.aspx

    DECLARE @number1 INT, @number2 INT
    
    SET @number1 = 1
    SET @number2 = 867
    
    SELECT FORMAT(@number1, 'd10')
    SELECT FORMAT(@number2, 'd10')
    
        3
  •  21
  •   KM.    16 年前

    使用 REPLICATE 所以您不必硬编码所有前导零:

    DECLARE @InputStr int
           ,@Size     int
    SELECT @InputStr=123
          ,@Size=10
    
    PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)
    

    输出:

    0000000123
    
        4
  •  13
  •   GoldBishop    14 年前

    不是为了突出这个问题,但是需要注意的是,您需要使用(n)varchar而不是(n)char数据类型。

    RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )
    

    上面的段,将不会产生来自SQL 2005的正确响应

    RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )
    

    上面的片段,将从sql 2005中产生所需的响应

    varchar将动态地为您提供所需的前缀长度。 其中,作为定长数据类型,需要指定和调整长度。

        5
  •  5
  •   Sedecimdies    13 年前

    我喜欢用

    DECLARE @Length int
    DECLARE @Number int
    SET @Length = 9
    SET @Number = 4
    
    select right( POWER(10, @Length) + @Number, @Length)
    

    这给了我

    000000004
    
        6
  •  4
  •   C.List    12 年前

    数据类型“int”不能超过10位,另外“len()”函数对int起作用,因此在调用len()函数之前不需要将int转换为字符串。

    最后,您没有考虑int的大小>要填充到的总位数(@intlen)的情况。

    因此,更简洁/正确的解决方案是:

    CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
    AS
    BEGIN
        IF @intlen > 20 SET @intlen = 20
        IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
        RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
    END
    
        7
  •  2
  •   Piotr Nawrot    10 年前

    单线解决方案( 本身 )对于SQL Server 2008或更高版本:

    DECLARE @DesiredLenght INT = 20;
    SELECT 
        CONCAT(
            REPLICATE(
                '0',
                (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
            [Column])
    FROM Table;
    

    乘 SIGN 表达式等于 MAX(0, @DesiredLenght-LEN([Column])) . 问题是 MAX() 只接受一个参数…

        8
  •  2
  •   Serneum    8 年前

    不是很优雅,但我添加了一个设置值,其前导零的数量与我想要转换的数字相同,并使用了正确的函数。

    例子:

    SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)
    

    结果:“000867”

        9
  •  1
  •   Andrew Hare    16 年前

    我找到一篇好文章 here :

    用前导零填充字符串

    我需要做很多次 输出定长数据时 例如,导出数值 列有9个字符,您 需要以前导0作为前缀。

        10
  •  1
  •   Tarun Gupta    13 年前
        select right('000' + convert(varchar(3),id),3) from table
    
        example
        declare @i int
        select @i =1
    
    select right('000' + convert(varchar(3),@i),3)
    

    顺便说一下,如果它是一个int列,那么它仍然不会保留0 只需在表示层中执行,或者如果您真的需要在 选择

        11
  •  1
  •   user2096582    13 年前

    有同样的问题,我就是这样解决的…古朴典雅。“4”是字符串的长度,不管传递的整数长度是多少,它都将填充0到“4”。

    STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))
    
        12
  •  1
  •   jhimes    12 年前

    在我的例子中,我希望我的字段在10个字符的字段中有前导0(nvarchar(10))。 源文件不需要前导0就可以在另一个表中联接到。 这仅仅是由于在SQL Server 2008R2上:

    设置字段=右(('0000000000'+[字段]),10) (无法使用format(),因为这是预sql2012)

    对现有数据执行此操作。因此,这样1或987654321仍将用前导0填充所有10个空格。

    由于新数据将被导入,然后通过Access数据库转储到表中,因此当从Access向SQL Server表追加任何新记录时,我可以使用格式([字段],“0000000000”)。

        13
  •  0
  •   user286517    13 年前
    DECLARE @number1 INT, @number2 INT
    
    SET @number1 = 1
    
    SET @number2 = 867
    

    --如果没有“rtrim”,返回的值是 3__ !!!!

    SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED
    

    --如果没有“rtrim”,返回的值是 867___ !!!!

    SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED
    
        14
  •  0
  •   Peter Gluck    12 年前

    使用 RIGHT 是一个不错的选择,但您也可以执行以下操作:

    SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)
    

    哪里 N 是要显示的总位数。所以对于带前导零的3位数值( N = 3 ):

    SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)
    

    或交替

    SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)
    

    这样做的目的是将期望值加到一个10的幂中,这个幂足够产生足够的前导零,然后切断前导1。

    这种技术的优点是结果总是相同的长度,允许使用 SUBSTRING 而不是 正确的 ,这在某些查询语言(如hql)中不可用。

        15
  •  0
  •   Tricky Silence    10 年前

    我在mysql中的工作是:

    FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
      RETURNS varchar(255) CHARSET utf8
    BEGIN
      return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
    END
    

    例如:

    leadingZero('000',999); returns '999'
    leadingZero('0000',999); returns '0999'
    leadingZero('xxxx',999); returns 'x999'
    

    希望这会有帮助。 最好的问候

        16
  •  -2
  •   Niren    12 年前

    我在想,这对你有用吗?

    declare @val int,@len=800
    select replace(str(@val,@len),' ','0')
    
    推荐文章