我有下表A:
id
----
1
2
12
123
1234
我需要用零填充id
值:
id
----
0001
0002
0012
0123
1234
我怎样才能做到这一点?
答案 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
答案 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