web-dev-qa-db-ja.com

T-SQLでintをゼロパディング文字列に変換するにはどうすればよいですか?

値が1のintがあるとします。そのintを00000001などのゼロパディング文字列に変換するにはどうすればよいですか?

40
flipdoubt
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8

Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
40
Charles Bretana

別の方法は次のとおりです。

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

sQL Server 2012の時点で、これを行うことができます。

format(@int, '0000#')
31
gordy

私のためのこの仕事:

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

例:

SELECT dbo.CIntToChar(867、6)AS COD_ID

出力

000867

9
RicardoBalda

FORMAT(<your number>,'00000000')を使用します。最終結果に数字を含めるのに必要な数のゼロを使用します。

ここにFORMAT関数の公式ドキュメントがあります

3
Ilia Gilmijarow

特定の全長にパディングしようとする場合、次のように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のサイズを心配する必要はありません。

1

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
1
Jim Birchall

私はいつも使用します:

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

Zは、SQLが追加/連結のために文字列を暗黙的にintに変換するのを防ぎます。

1
Amy B

'0'でのパディングについて考える非常に簡単な方法は、@ _ intを小数点以下4桁に修正した場合、4つの '0'を挿入することです。

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

;固定スペースが3の場合、3'0を注入します

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

;以下に「00」を注入して、各ビルに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'
1
Jenna Leaf

または、本当にハードコアにしたい場合... ;-)

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
0
user39603

チャールズ・ブレタナの答えは最も単純で最速だと思います。 STRを使用しない同様のソリューションは次のとおりです。

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

そして、REPLICATEを使用してこれがあります:

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

もちろん、必要に応じて、リテラル7および '1'を適切な関数に置き換えることができます。上記に例を示します。例えば:

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

8桁未満の整数に最大8文字のゼロを埋め込みます。

現在、REPLICATEの2番目の引数の負の数はNULLを返します。したがって、可能であれば(上記の例で@myIntは1億を超える可能性があります)、COALESCEを使用して、8文字を超える場合に先行ゼロなしで数値を返すことができます。

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