如何用前导零将int转换为char?


98

我需要将int数据字段转换为前导零的nvarchar

例:

1转换为'001'

867转换为'000867'等

谢谢。


这是我4小时后的回复...

我测试了此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

我创建了这个用户功能

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

范例:

选择dbo.CIntToChar(867,6)AS COD_ID

输出值

000867


1
在您的第一个示例中,CAST应该是NVARCHAR而不是NCHAR类型,因为NCHAR(3)的长度始终为
3。– nzeemin

Answers:


99

试试这个: select right('00000' + cast(Your_Field as varchar(5)), 5)

它将以5位数字获得结果,例如:00001,....,01234


1
请注意,对于postgres,您需要将+替换为||,因此select right('00000' || cast(Your_Field as varchar(5)), 5)
ronedg

56

您还可以使用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')

我将同意使用SQL2012,但是对于那些SQL 2008r2和更早版本的SQL2012,我的解决方案将得到结果
GoldBishop 2014年

1
刚刚测试过FORMAT Sql Server 2012-它很慢,因为“每几秒钟一个数字”很慢。远离。
Muposat 2015年

@Muposat,能否请您提供该测试的代码?这很重要。提前致谢。
DiomedesDomínguez17年

3
@DiomedesDomínguez已经一年了,所以我不再有原始测试。我只是在一个非常快的服务器上运行了另一个测试,却花了32秒格式化一百万个数字。不是世界末日,而是Nguyen Tran发布的解决方案在1秒内完成。为了测试纯粹从@i INT创建一个循环= 0到10000000
Muposat

22

使用它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)

输出:

0000000123

13

并非对这个问题有很高的认识,但需要注意的是,您需要使用(N)VARCHAR而不是(N)CHAR数据类型。

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

上面的段,将不会从SQL 2005产生正确的响应

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

以上部分,将从SQL 2005产生所需的响应

varchar会为您动态提供所需的前缀长度。其中,固定长度数据类型需要长度指定和调整。


6

我喜欢用

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

这给了我

000000004

1
感觉有些古怪,但是它在DB2中对我有用。我无法获得以上答案才能正常工作。
内森·M。

2
我也喜欢这个。如果长度为硬编码的,你可以使用RIGHT(1000+Number, 3)-漂亮,短而快
MAF-软

1
从2005年起,此功能适用于所有SQL Server变体。首选答案。
Fandango68 '18

1
10是什么意思?
Fandango68 '18

1
@ Fandango68上面的'POWER(10,@Length)'中的'10'是因为我们使用基数10的算术-因此上面的maf-soft答案中的'1000'文字等同于POWER(10,3)-10 ^ 3 = 1000
qxotk

4

数据类型“ int”不能超过10位,此外,“ Len()”函数适用于int,因此在调用len()函数之前无需将int转换为字符串。

最后,您没有考虑int的大小>您希望填充到(@intLen)的位数总数的情况。

因此,一个更简洁/正确的解决方案是:

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

3

不是很优雅,但是我向想要转换的数字添加了一个具有相同数量的前导零的设置值,并使用了RIGHT函数。

例:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

结果:“ 000867”


2

SQL Server 2008或更高版本的一种解决方案(本身):

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

SIGN表达式相乘等于MAX(0, @DesiredLenght-LEN([Column]))。问题是MAX()只接受一个参数。


1

我在这里找到了一篇好文章:

用前导零填充字符串

输出固定长度的数据导出时,例如数字列的长度为9个字符,并且需要以0开头作为前缀,我需要做很多次。


1
    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中执行此操作


1

遇到同样的问题,这就是我的解决方法...简单而优雅。“ 4”是字符串应该有多长,无论传递的整数长度是多少,都将填充零至“ 4”。

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))

1

在我的情况下,我希望我的字段在10个字符的字段中具有前导0(NVARCHAR(10))。源文件不需要前导0即可加入另一个表。这样做仅仅是由于位于SQL Server 2008R2上:

Set Field = right((''0000000000'+ [Field]),10) (不能使用Format(),因为这是SQL2012之前的版本)

针对现有数据执行此操作。因此,以这种方式1或987654321仍将用前导0填充所有10个空格。

由于要导入新数据,然后通过Access数据库将其转储到表中,因此当从Access附加到任何新记录的SQL Server表时,我可以使用Format([Field],“ 0000000000”)。


0
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

0

使用RIGHT是一个不错的选择,但您也可以执行以下操作:

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)中不可用。


0

这对我在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'

希望这会有所帮助。最好的祝福


0

在SQLServer中工作

declare @myNumber int = 123
declare @leadingChar varchar(1) = '0'
declare @numberOfLeadingChars int = 5

select right(REPLICATE ( @leadingChar , @numberOfLeadingChars ) + cast(@myNumber as varchar(max)), @numberOfLeadingChars)

请享用


-2

我想知道,这对您有用吗?

declare @val int,@len=800
select replace(str(@val,@len),' ','0')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.