Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String T-SQL中的PadLeft函数_String_Tsql - Fatal编程技术网

String T-SQL中的PadLeft函数

String T-SQL中的PadLeft函数,string,tsql,String,Tsql,我有下表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 或 我还没有在第二个示例中测试语法。我不确定这是否100%有效-可能需要一些调整-但它传达了如何获得所需输出的总体思路 编辑 要解决评论中列出的问题

我有下表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

我还没有在第二个示例中测试语法。我不确定这是否100%有效-可能需要一些调整-但它传达了如何获得所需输出的总体思路

编辑

要解决评论中列出的问题

@pkr298-是STR只对数字有效。。。OP的字段是一个ID。。。因此,只有数字

@荒凉者-那当然不行了。。。第一个参数的长度为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

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

旧帖子,但也许这有助于某人:

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

SQL Server现在支持从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的值,Repeat将返回
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@minlen int=6
声明@str varchar(20)
set@str='123'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:000123
set@str='1234'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:001234
set@str='123456'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:123456
set@str='123456789'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:123456789
set@str='123456789'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:123456789
set@str='NEFT 123456789'
选择len(@str)<@minlen然后复制('0',@minlen len(@str))+@str else@str end时的大小写
--答复:NEFT 123456789
——请查看这些

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

--我希望这些可以帮助您

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

选择CONCAT(复制('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)


返回:0000000123

如果有人仍然感兴趣,我会在数据库中找到这篇文章。指南:

简而言之,这篇文章中提到了3种方法。
假设您的id=12,您需要它显示为0012

方法1–使用RIGHT()函数 第一个方法使用RIGHT()函数,在添加一些前导零后,只返回字符串最右边的部分

选择右侧('00'+'12',4)
结果:
0012

方法2–结合使用RIGHT()和REPLICATE()
此方法与前面的方法几乎相同,唯一的区别是我只是用REPLICATE()函数替换了三个零:

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;
选择右侧(复制('0',2)+'12',4)

结果:
0012

方法3–结合使用REPLACE()和STR()
此方法与以前的方法完全不同:

选择替换(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

另请参见STR()仅适用于数字(或字符串字段中的数字)。如果在假设有数字但其中一条记录有错误(非数字)数据的varchar字段上使用此代码,则此代码将中断。在这种情况下,RIGHT()函数不会中断。如果数字的长度较大(例如
STR(123456,4)),STR()函数将不起作用
将返回
**
@sailator我添加了一个响应和修复程序以促进您添加的场景。这如何回答OPs关于用零填充的问题?@SilverM-a,没有在数字之前添加0的实用程序,因为它们无论如何都会被忽略(0003毕竟是3)。可能您要完成的是将该数字转换为字符串(varchar),然后使用上述语句。@SilverM-a,如果是这种情况,请使用“cast”命令进行转换,如:SELECT RIGHT('0000000000'+cast(COLUMNNAME AS varchar),10)来自TABLENAME;是吗?@MarceloMyara这应该是答案的一部分,而不仅仅是一个评论。现在我自己添加。注意:这是最有效的