T-SQL中的PadLeft函数


113

我有下表A:

id
----
1
2
12
123
1234

我需要左id值零填充:

id
----
0001
0002
0012
0123
1234

我该如何实现?

Answers:


197

我相信这可能是您要寻找的:

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


4
STR()仅适用于数字(或字符串字段中的数字)。如果您在假定具有数字但其中一条记录包含错误的(非数字)数据的varchar字段上使用该代码,则该代码将中断。在这种情况下,RIGHT()函数不会中断。
pkr298

1
如果数字更大,则STR()函数将不起作用(例如,STR(123456, 4)将返回****

2
@Desolator我添加了响应和修复程序,以简化您添加的场景。
Patrick

66

SQL Server现在从2012版开始支持FORMAT函数,因此:

SELECT FORMAT(id, '0000') FROM TableA

会成功的

如果您的ID或列在中,varchar并且代表一个数字,请先进行转换:

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

光滑简单,谢谢!给出原始问题的日期,现在应该是正式答案了;)
David Gunderson

1
如果id是字符串,则可以先将其转换为整数-选择format(convert(int,id),'0000')
CrimsonKing

抱歉,我不赞成,因为这种方式的确很慢。花了整整四秒钟的时间运行了90行,而被接受的答案却是即时的。这是一个非常主要的缺点,FORMAT最多只能用于一两个记录。否则,由于性能很差,它是无用的。
暗影巫师为您耳边

@ShadowWizard我看到使用FORMAT并具有1000行的即时性能。
JohnnyHK '19

@JohnnyHK可能与表设计或其他数据库怪癖有关,但...事实是,对我而言,它确实很慢,而另一方面却很快速。
暗影巫师为您耳边


43

旧帖子,但这也许可以帮助某人:

要完成,直到它以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;

1
@ SilverM-A,没有实用程序在数字前加0,因为无论如何它们都将被忽略(毕竟0003是3)。您可能要完成的工作是将该数字转换为字符串(varchar),然后使用上面的语句。
Marcelo Myara

1
@ SilverM-A,如果是这种情况,只需使用“ CAST”命令进行转换,例如:SELECT RIGHT('0000000000'+ CAST(COLUMNNAME AS VARCHAR),10)FROM TABLENAME; 是吗
Marcelo Myara

@MarceloMyara,这应该是答案的一部分,而不仅仅是评论。现在添加我自己。
暗影巫师为您耳边

注意:这是最有效的答案,没有花哨的功能可能会变慢。因此,我给予了额外的赏金。
暗影巫师为您耳边

12

试试这个:

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


5

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

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

4所需长度在哪里。适用于4位以上的数字,返回空字符串NULL


3

如果仍然有人感兴趣,我在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

查看文章,其中有更多深入的示例分析。


2

这是我通常需要填充值时使用的格式。

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

1

我在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'

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)

只是关于标准的一点,我不会理会IsNull检查,如果该值为null,则该函数仍应为该值返回null,因为这是内置函数的标准行为。如果我们将所有内容都转换为非null值,则调用者将不再能够使用他们可能期望的null逻辑运算。(空在我的很多的表意为“未指定”,应使用默认值。SELECT @var = LTRIM(RTRIM(@Text))
克里斯·夏勒博士

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


0

如果需要的话,可能会完全符合ODBC:

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

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


0

我的解决方案效率不高,但是在值(银行支票号和电汇参考号)存储为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


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

结果示例


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.