[英]How do I convert an int to a zero padded string in T-SQL?
假設我有一個值為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
OUTPUT
000867
使用FORMAT(<your number>,'00000000')
使用盡可能多的零,您需要在最終結果中包含數字。
考慮使用'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'為每個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'
如果我試圖填充特定的總長度,我使用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的大小,只要它<=最終的字符串長度。
我一直用:
SET @padded = RIGHT('z0000000000000'
+ convert(varchar(30), @myInt), 8)
z阻止SQL將字符串隱式轉換為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
然后就是這個,使用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))
或者,如果你真的想要去核心... ;-)
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
我認為Charles Bretana的答案是最簡單和最快的。 不使用STR
類似解決方案是:
SELECT REPLACE(REVERSE(
CONVERT(CHAR(5 /*<= Target length*/)
, REVERSE(CONVERT(VARCHAR(100), @MyInt)))
), ' ', '0')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.