PadLeft function in T-SQL

后端 未结 17 2771
挽巷
挽巷 2020-11-27 03:44

I have the following table A:

id
----
1
2
12
123
1234

I need to left-pad the id values with zero\'s:

id
----
0         


        
相关标签:
17条回答
  • 2020-11-27 04:07
    declare @T table(id int)
    insert into @T values
    (1),
    (2),
    (12),
    (123),
    (1234)
    
    select right('0000'+convert(varchar(4), id), 4)
    from @T
    

    Result

    ----
    0001
    0002
    0012
    0123
    1234
    
    0 讨论(0)
  • 2020-11-27 04:08

    Try this:

    SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]
    
    0 讨论(0)
  • 2020-11-27 04:08

    -- Please look into these.

    select FORMAT(1, 'd4');
    select FORMAT(2, 'd4');
    select FORMAT(12, 'd4');
    select FORMAT(123, 'd4');
    select FORMAT(1234, 'd4');
    

    -- I hope these would help you

    0 讨论(0)
  • 2020-11-27 04:12

    I believe this may be what your looking for:

    SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 
    
    FROM tableA
    

    or

    SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]
    
    FROM tableA
    

    I haven't tested the syntax on the 2nd example. I'm not sure if that works 100% - it may require some tweaking - but it conveys the general idea of how to obtain your desired output.

    EDIT

    To address concerns listed in the comments...

    @pkr298 - Yes STR does only work on numbers... The OP's field is an ID... hence number only.

    @Desolator - Of course that won't work... the First parameter is 6 characters long. You can do something like:

    SELECT REPLACE(STR(id,
    (SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA
    

    this should theoretically move the goal posts... as the number gets bigger it should ALWAYS work.... regardless if its 1 or 123456789...

    So if your max value is 123456... you would see 0000123456 and if your min value is 1 you would see 0000000001

    0 讨论(0)
  • 2020-11-27 04:13

    Something fairly ODBC compliant if needed might be the following:

    select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
            + cast (FIELD as varchar(10))
      from TABLE_NAME
    

    This bases on the fact that the amount of digits for a base-10 number can be found by the integral component of its log. From this we can subtract it from the desired padding width. Repeat will return null for values under 1 so we need ifnull.

    0 讨论(0)
  • 2020-11-27 04:13

    I created a function to do this, where you can specify the desired output character length:

    CREATE FUNCTION [dbo].[udfLeadingZero]
    (
            @String VARCHAR(MAX)
    ,       @Len INT
    )
    RETURNS VARCHAR(MAX)
    BEGIN
        SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
    RETURN @String
    END
    GO
    

    Example results

    0 讨论(0)
提交回复
热议问题