T-SQL中的PadLeft函数

时间:2011-04-04 14:36:57

标签: string tsql

我有下表A:

id
----
1
2
12
123
1234

我需要用零填充id值:

id
----
0001
0002
0012
0123
1234

我怎样才能做到这一点?

17 个答案:

答案 0 :(得分:184)

我相信这可能是你所寻找的:

SELECT padded_id = REPLACE(STR(id, 4), SPACE(1), '0') 

FROM tableA

SELECT REPLACE(STR(id, 4), SPACE(1), '0') AS [padded_id]

FROM tableA

我没有测试第二个例子的语法。我不确定这是否100%有效 - 可能需要一些调整 - 但它传达了如何获得所需输出的一般想法。

修改

解决评论中列出的问题...

@ pkr298 - 是STR仅适用于数字... OP的字段是ID ...因此仅限数字。

@Desolator - 当然不起作用......第一个参数是6个字符长。你可以这样做:

SELECT REPLACE(STR(id,
(SELECT LEN(MAX(id)) + 4 FROM tableA)), SPACE(1), '0') AS [padded_id] FROM tableA

这理论上应该移动目标岗位......随着数量变大,它应该始终有效....无论是1还是123456789 ......

因此,如果你的最大值是123456 ......你会看到0000123456,如果你的最小值是1,你会看到0000000001

答案 1 :(得分:57)

declare @T table(id int)
insert into @T values
(1),
(2),
(12),
(123),
(1234)

select right('0000'+convert(varchar(4), id), 4)
from @T

结果

----
0001
0002
0012
0123
1234

答案 2 :(得分:50)

SQL Server现在支持从2012版开始的FORMAT函数,所以:

SELECT FORMAT(id, '0000') FROM TableA

会做到这一点。

如果您的ID或列位于varchar并代表您先转换的数字:

SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA

答案 3 :(得分:35)

旧帖子,但也许这有助于某人:

要完成,最后会有4个非空白字符:

SELECT RIGHT ('0000'+COLUMNNAME, 4) FROM TABLENAME;

要完成到10:

SELECT RIGHT ('0000000000'+COLUMNNAME, 10) FROM TABLENAME;

如果列是数字,请先使用以下代码将其转换为varchar:

Select RIGHT('0000'+Convert(nvarchar(20), COLUMNNAME), 4)
From TABLENAME

使用数字字段完成到10:

SELECT RIGHT ('0000000000'+Convert(nvarchar(20), COLUMNNAME), 10) FROM TABLENAME;

答案 4 :(得分:12)

试试这个:

SELECT RIGHT(REPLICATE('0',4)+CAST(Id AS VARCHAR(4)),4) FROM [Table A]

答案 5 :(得分:8)

- 请查看这些内容。

select FORMAT(1, 'd4');
select FORMAT(2, 'd4');
select FORMAT(12, 'd4');
select FORMAT(123, 'd4');
select FORMAT(1234, 'd4');

- 我希望这些可以帮到你

答案 6 :(得分:5)

这适用于字符串,整数和数字:

SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)

需要4的地方。适用于超过4位数的数字,在NULL值上返回空字符串。

答案 7 :(得分:2)

这是我在需要填充值时通常使用的。

SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)

答案 8 :(得分:1)

我在SQL服务器上的一个函数中需要这个,并稍微调整了Patrick的答案。

declare @dossierId int = 123
declare @padded_id varchar(7)


set @padded_id = REPLACE(
              SPACE(7 - LEN(@dossierId)) + convert(varchar(7), @dossierId), 
              SPACE(1),  
              '0') 

SELECT @dossierId as '@dossierId'
      ,SPACE(LEN(@dossierId)) + convert(varchar(7)
      ,@dossierId) as withSpaces
      ,@padded_id as '@padded_id'

答案 9 :(得分:1)

如果仍然有人感兴趣,我在DATABASE.GUIDE上找到了这篇文章:
Left Padding in SQL Server – 3 LPAD() Equivalents

简而言之,该文章中提到了3种方法。
假设您的id = 12,您需要将其显示为0012。

方法1 –使用RIGHT()函数
第一种方法使用RIGHT()函数在添加一些前导零之后仅返回字符串的最右边部分。

SELECT RIGHT('00' + '12', 4);

结果:
0012

方法2 –使用RIGHT()和REPLICATE()的组合
此方法与以前的方法几乎相同,唯一的区别在于,我只是用REPLICATE()函数替换了三个零:

SELECT RIGHT(REPLICATE('0', 2) + '12', 4);

结果:
0012

方法3 –结合使用REPLACE()和STR()
此方法与以前的方法完全不同:

SELECT REPLACE(STR('12', 4),' ','0');

结果:
0012

查看文章,这里有更多深入的实例分析。

答案 10 :(得分:1)

创建功能:

    Create FUNCTION [dbo].[PadLeft]
      (
        @Text NVARCHAR(MAX) ,
        @Replace NVARCHAR(MAX) ,
        @Len INT
      )
RETURNS NVARCHAR(MAX)
AS
    BEGIN 


        DECLARE @var NVARCHAR(MAX) 

        SELECT @var = ISNULL(LTRIM(RTRIM(@Text)) , '')


        RETURN   RIGHT(REPLICATE(@Replace,@Len)+ @var, @Len)


    END

示例:

Select dbo.PadLeft('123456','0',8)

答案 11 :(得分:1)

我创建了一个函数:

CREATE FUNCTION [dbo].[fnPadLeft](@int int, @Length tinyint)
RETURNS varchar(255) 
AS 
BEGIN
    DECLARE @strInt varchar(255)

    SET @strInt = CAST(@int as varchar(255))
    RETURN (REPLICATE('0', (@Length - LEN(@strInt))) + @strInt);
END;

使用:选择dbo.fnPadLeft(123,10)

返回:0000000123

答案 12 :(得分:0)

我创建了一个函数来执行此操作,您可以在其中指定所需的输出字符长度:

CREATE FUNCTION [dbo].[udfLeadingZero]
(
        @String VARCHAR(MAX)
,       @Len INT
)
RETURNS VARCHAR(MAX)
BEGIN
    SET @String = RIGHT(REPLICATE('0',@Len)+@String,@Len)
RETURN @String
END
GO

Example results

答案 13 :(得分:0)

一个简单的例子是

    DECLARE @number INTEGER
    DECLARE @length INTEGER
    DECLARE @char   NVARCHAR(10)
    SET @number = 1
    SET @length = 5
    SET @char = '0'

    SELECT FORMAT(@number, replicate(@char, @length))

答案 14 :(得分:0)

我的解决方案效率不高,但在价格(银行支票号码和电汇参考编号)存储为varchar的情况下帮助了我,其中某些条目的字母数字值与它们相同,如果长度小于6个字符。

如果有人遇到同样的情况,请考虑分享

declare @minlen int = 6
declare @str varchar(20)

set @str = '123'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 000123

set @str = '1234'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 001234

set @str = '123456'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789

set @str = '123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: 123456789


set @str = 'NEFT 123456789'
select case when len(@str) < @minlen then REPLICATE('0',@minlen-len(@str))+@str else @str end
--Ans: NEFT 123456789

答案 15 :(得分:0)

如果需要,可以使用符合ODBC标准的内容:

select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
        + cast (FIELD as varchar(10))
  from TABLE_NAME

这是基于这样一个事实,即基数为10的数字位数可以通过其对数的积分分量找到。从中我们可以从所需的填充宽度中减去它。对于低于1的值,重复将返回null,因此我们需要ifnull

答案 16 :(得分:-4)

更有效的方法是:

Select id, LEN(id)
From TableA
Order by 2,1 

The result :
id
----
1
2
12
123
1234