如何将int转换为具有前导零的字符?
我需要将int数据字段转换为具有前导零的nvarchar
例:
1转换为“001”
867转换为“000867”等
谢谢。
这是我4小时后的回应…
我testing了这个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
我创build了这个用户function
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
例如:
SELECT dbo.CIntToChar(867,6)AS COD_ID
OUTPUT
000867
试试这个: select right('00000' + cast(Your_Field as varchar(5)), 5)
它会得到5位数的结果,例如:00001,…,01234
您还可以使用SQL Server 2012中引入的FORMAT()函数。 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')
使用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)
OUTPUT:
0000000123
不要高 – 杰克这个问题,但需要注意,你需要使用(N)VARCHAR,而不是(N)CHAR数据types。
RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )
上面的段,将不会从SQL 2005产生正确的响应
RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )
上面的段,将从SQL 2005产生所需的响应
varchar将为您提供所需的前缀长度。 固定长度数据types需要长度指定和调整。
数据types“int”不能超过10位数,另外“Len()”函数在整数上起作用,因此在调用len()函数之前不需要将int转换为string。
最后,你没有考虑到你的int的大小>你想要填充的位数的总数(@intLen)的情况。
因此,一个更简洁/正确的解决scheme是:
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
我喜欢用
DECLARE @Length int DECLARE @Number int SET @Length = 9 SET @Number = 4 select right( POWER(10, @Length) + @Number, @Length)
这给了我
000000004
我在这里find了一篇好文章:
用前导零填充string
在输出一个固定长度的数据导出时,我需要这么做很多次,例如一个数字列的长度是9个字符,而您需要以前导0作为前缀。
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列,那么它仍然不会保留零只是在表示层做,或者如果你真的需要在SELECT
有同样的问题,这是我如何解决…简单而优雅。 “4”是string的长度,无论长度是多less,都会填充0到“4”。
STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))
在我的情况下,我希望我的字段在10个字符字段(NVARCHAR(10))中具有前导0。 源文件不具有需要join到另一个表中的前导0。 这是否仅仅是由于在SQL Server 2008 R2上:
设置字段=右(('0000000000'+ [字段]),10) (不能使用格式(),因为这是SQL2012之前)
对现有数据执行此操作。 所以这样1或987654321仍然会用前导0填充全部10个空格。
由于新数据正在导入,然后通过Access数据库转储到表中,所以在从Access追加到SQL服务器表中的任何新logging时,我都可以使用Format([Field],“0000000000”)。
SQL Server 2008或更高版本的一行解决scheme( 本身 ):
DECLARE @DesiredLenght INT = 20; SELECT CONCAT( REPLICATE( '0', (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ), [Column]) FROM Table;
SIGN
expression式的乘法等价于MAX(0, @DesiredLenght-LEN([Column]))
。 问题是MAX()
只接受一个参数…
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
使用RIGHT
是一个不错的select,但您也可以执行以下操作:
SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)
其中N
是您想要显示的总位数。 因此,对于具有前导零( N = 3
)的3位数值:
SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)
或者交替地
SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)
这样做是将所需的值加到足够大的10的幂以产生足够的前导零,然后切断前导1。
这种技术的优点是结果将始终是相同的长度,允许使用SUBSTRING
而不是RIGHT
,这在某些查询语言(如HQL)中是不可用的。
这个工作适合我在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'
希望这会有所帮助。 最好的祝福
我在想,这会对你有用吗?
declare @val int,@len=800 select replace(str(@val,@len),' ','0')