【发布时间】:2011-07-29 05:52:14
【问题描述】:
我有下表A:
id
----
1
2
12
123
1234
我需要用零填充 id 值:
id
----
0001
0002
0012
0123
1234
我怎样才能做到这一点?
【问题讨论】:
我有下表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
我没有测试第二个例子的语法。我不确定这是否 100% 有效 - 它可能需要进行一些调整 - 但它传达了如何获得所需输出的总体思路。
编辑
为了解决 cmets 中列出的问题...
@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
【讨论】:
STR(123456, 4) 将返回 ****
SQL Server 现在从 2012 版开始支持 FORMAT 函数,所以:
SELECT FORMAT(id, '0000') FROM TableA
会成功的。
如果您的 id 或列在 varchar 中并表示您首先转换的数字:
SELECT FORMAT(CONVERT(INT,id), '0000') FROM TableA
【讨论】:
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
旧帖子,但也许这可以帮助某人:
完成直到它以 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;
【讨论】:
试试这个:
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');
--希望对你有帮助
【讨论】:
这适用于字符串、整数和数字:
SELECT CONCAT(REPLICATE('0', 4 - LEN(id)), id)
4 是所需的长度。适用于超过 4 位的数字,在 NULL 值上返回空字符串。
【讨论】:
这是我在需要填充值时通常使用的。
SET @PaddedValue = REPLICATE('0', @Length - LEN(@OrigValue)) + CAST(@OrigValue as VARCHAR)
【讨论】:
如果有人仍然感兴趣,我在 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
查看文章,有更深入的示例分析。
【讨论】:
我创建了一个函数来执行此操作,您可以在其中指定所需的输出字符长度:
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
【讨论】:
我在 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'
【讨论】:
创建函数:
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)
【讨论】:
SELECT @var = LTRIM(RTRIM(@Text))
我创建了一个函数:
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
【讨论】:
如果需要,一些相当符合 ODBC 的东西可能如下:
select ifnull(repeat('0', 5 - (floor(log10(FIELD_NAME)) + 1)), '')
+ cast (FIELD as varchar(10))
from TABLE_NAME
这是基于这样一个事实,即基数为 10 的数字的位数可以通过其日志的积分部分找到。从中我们可以从所需的填充宽度中减去它。对于小于 1 的值,重复将返回 null,因此我们需要 ifnull。
【讨论】:
我的解决方案效率不高,但在值(银行支票号码和电汇参考号)存储为 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
【讨论】:
一个简单的例子是
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))
【讨论】:
更有效的方法是:
Select id, LEN(id)
From TableA
Order by 2,1
The result :
id
----
1
2
12
123
1234
【讨论】: