T-SQL 中的整数 PadLeft 函数

我有下表 A:

id
----
1
2
12
123
1234

我需要在 id值的左边垫上零:

id
----
0001
0002
0012
0123
1234

我怎么才能做到呢?

296360 次浏览

我相信这就是你要找的:

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

我还没有在第2个例子中测试语法。我不确定这是否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,您将看到000000001

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

试试这个:

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

我需要在 SQL 服务器的一个函数,并调整了帕特里克的答案一点。

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'

旧文章,但也许这个能帮到某人:

完成,直到最后出现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;

SQLServer 现在支持从2012版本开始的 格式函数,因此:

SELECT FORMAT(id, '0000') FROM TableA

会有用的。

如果您的 id 或列在 varchar中,并且表示您首先转换的数字:

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

更有效的方法是:

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


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

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

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

如果需要,可以采用与 ODBC 相当兼容的方式:

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

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

我的解决方案不是有效的,但帮助我的情况下的价值(银行支票号码和电汇参考号码。)被存储为 varchar,其中一些条目具有 alpha 数值,如果长度小于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

请看看这些。

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

我希望这些能帮到你

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

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

其中 4是所需的长度。适用于4位以上的数字,返回 NULL值上的空字符串。

创建功能:

    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)

我创建了一个函数:

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)

报税表: 000000123

如果有人仍然感兴趣,我在数据库指南上找到了这篇文章:
SQLServer-3LPAD ()等效项中的左填充

简而言之,这篇文章中提到了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

查看文章,有更深入的分析与例子。

一个简单的例子是

    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))

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

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

示例结果