値が1のintがあるとします。そのintを00000001
などのゼロパディング文字列に変換するにはどうすればよいですか?
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8
Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
別の方法は次のとおりです。
DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')
sQL Server 2012の時点で、これを行うことができます。
format(@int, '0000#')
私のためのこの仕事:
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
FORMAT(<your number>,'00000000')
を使用します。最終結果に数字を含めるのに必要な数のゼロを使用します。
特定の全長にパディングしようとする場合、次のように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のサイズを心配する必要はありません。
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
私はいつも使用します:
SET @padded = RIGHT('z0000000000000'
+ convert(varchar(30), @myInt), 8)
Zは、SQLが追加/連結のために文字列を暗黙的にintに変換するのを防ぎます。
'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'
または、本当にハードコアにしたい場合... ;-)
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
チャールズ・ブレタナの答えは最も単純で最速だと思います。 STR
を使用しない同様のソリューションは次のとおりです。
SELECT REPLACE(REVERSE(
CONVERT(CHAR(5 /*<= Target length*/)
, REVERSE(CONVERT(VARCHAR(100), @MyInt)))
), ' ', '0')
そして、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))