T-SQL中的PadLeft函数

我有下面的表格A:

id ---- 1 2 12 123 1234 

我需要用零填充id值:

 id ---- 0001 0002 0012 0123 1234 

我怎样才能做到这一点?

我相信这可能是你想要的:

 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 

我没有testing第二个例子的语法。 我不确定这是否可以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

 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 

旧post,但也许这可以帮助别人:

要完成,直到它结束了4个非blan字符:

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

要完成到10:

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

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

 SELECT FORMAT(id, '0000') FROM TableA 

会做的伎俩。

尝试这个:

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

– 请看看这些。

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

– 我希望这些会帮助你

这适用于string,整数和数字:

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

哪里4是所需的长度。 适用于超过4位数的数字,返回空值的空string。

当我需要填充一个值时,这是我通常使用的。

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

我需要这个在SQL服务器上的function,并调整帕特里克的答案了一下。

 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' 

如果需要的话,相当符合ODBC要求的东西可能如下:

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

这基于这样一个事实,即基数为10的数字的数量可以通过其日志的整数部分find。 从这里我们可以从所需的填充宽度中减去它。 对于1以下的值,重复将返回null ,所以我们需要ifnull

我的解决scheme效率不高,但帮助我的值(银行支票号码和电汇转号码)存储为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 

创buildfunction:

  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) 

我创build了一个函数:

 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; 

使用:select dbo.fnPadLeft(123,10)

返回:0000000123

更有效的方法是:

 Select id, LEN(id) From TableA Order by 2,1 The result : id ---- 1 2 12 123 1234