Answers:
我相信这可能是您要寻找的:
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
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 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
。
如果仍然有人感兴趣,我在DATABASE.GUIDE上找到了这篇文章:
SQL Server中的左填充– 3个LPAD()等效项
简而言之,该文章中提到了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
查看文章,其中有更多深入的示例分析。
我在SQL Server上的一个函数中需要此功能,并调整了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'
创建函数:
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;
使用:选择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为底的数字的位数可以通过其日志的整数部分找到。由此,我们可以从所需的填充宽度中减去它。重复将返回null
小于1的值,因此我们需要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
一个简单的例子是
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