SQL Server填充0与RIGHT不工作

问题描述:

我正在使用SQL Server 2008.SQL Server填充0与RIGHT不工作

我有一个varchar(30)列,其中包含检查号码。如果使用信用卡付款,checknbr将是一个零长度的字符串。我需要使用前导零来填充这些数据,这样整个输出就是十位数字。如果没有支票号码,它应该是十个零。

这里是我想看到的数据:

0000000000 
    0000000000 
    0000000114 
    0000000105 
    0000000007 

这是我一直在使用和我被困在查询:

SELECT RIGHT((CASE 
     WHEN LEN(checknbr) = 0 THEN '0000000000' 
     ELSE '0000000000'+checknbr 
    END),10) as checknbr 
    FROM payhistory 
    WHERE number = 12345678 

而这就是我得到:

0000000000 
    0000000000 
    114 
    105 
    7 

尝试另一种方式:

SELECT RIGHT('0000000000'+checknbr,10) 
    FROM payhistory 
    WHERE number = 3861821 

我得到了同样的结果。奇怪的是,我有一个varchar(10)列,其中

RIGHT('0000'+EDC.DatabaseNumber,4) 

产生的结果正是我之后的结果。我在这里错过了什么?有关RIGHT功能的怪癖?

在此先感谢

+0

你如何观测结果? –

如果您正在使用SQL Server 2012或向上尝试以下操作:

SELECT RIGHT(CONCAT('0000000000', checknbr), 10) 

的毗连将自动转换NULL值空字符串,消除了对额外检查的需求。

顺便说一下,您遇到的问题是,您的查询仍然将checknbr视为数字而不是varchar值。将它投射到varchar将为您解决这个问题。

编辑的SQL Server 2008:

既然你有没有NULL VARCHAR列值仍然出现在脑海的尾随空格的唯一的事情。尝试:用cast()convert()checknbr转换为字符值

SELECT RIGHT('0000000000' + RTRIM(checknbr), 10); 
+0

对不起,感到困惑。我正在使用SQL Server 2008,并已编辑我的帖子来澄清。 至于转换问题,我不明白如何查询可以查看checknbr作为一个数字,当它是一个varchar(30)列已经。当我CONVERT(VARCHAR(10),checknbr)并做同样的查询,我仍然得到相同的结果。 – LegalEagle

+0

@LegalEagle在这种情况下,它很好奇。你是否检查过你的空间值? 'RTRIM(checknbr)' – Jens

+0

你解决了它!在我的CONVERT语句中使用RTRIM(checknbr)修复了它!谢谢!!!! – LegalEagle

将解决'0000000000'隐式转换为整数0

select right('0000000000'+convert(varchar(10),checknbr),10) 
from payhistory 
where number = 3861821 

如果checknbr可以null,你希望它回来作为'0000000000',那么你可以用它在coalesce()isnull()

select right('0000000000'+isnull(convert(varchar(10),checknbr),''),10) 
from payhistory 
where number = 3861821 

如果checknbr不是一个数字,而是varchar(30) ,那么(正如Jens指出的那样),你可能已经填充了需要修剪的空间:

rextester演示:http://rextester.com/IRLV83801

create table payhistory (checknbr varchar(30)); 
insert into payhistory values ('0'), ('1'), ('   0'), ('0   '),('   '); 

select checknbr = right('0000000000'+checknbr,10) 
from payhistory 

回报:

+------------+ 
| checknbr | 
+------------+ 
| 0000000000 | 
| 0000000001 | 
|   0 | 
| 0   | 
|   | 
+------------+ 

如果你修剪填充的空间:

select checknbr = right('0000000000'+ltrim(rtrim(checknbr)),10) 
from payhistory 

回报:

+------------+ 
| checknbr | 
+------------+ 
| 0000000000 | 
| 0000000001 | 
| 0000000000 | 
| 0000000000 | 
| 0000000000 | 
+------------+ 
+0

我只是尝试这样做: 'SELECT RIGHT( '0000000000' + CONVERT(VARCHAR(10),checknbr),10) FROM payhistory 其中number = 3861821' ,它在原来的职位产生完全相同的结果。 当没有值时,Checknbr是一个空字符串。该列中没有空值。 – LegalEagle