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