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