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功能的怪癖?
在此先感谢
如果您正在使用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);
对不起,感到困惑。我正在使用SQL Server 2008,并已编辑我的帖子来澄清。 至于转换问题,我不明白如何查询可以查看checknbr作为一个数字,当它是一个varchar(30)列已经。当我CONVERT(VARCHAR(10),checknbr)并做同样的查询,我仍然得到相同的结果。 – LegalEagle
@LegalEagle在这种情况下,它很好奇。你是否检查过你的空间值? 'RTRIM(checknbr)' – Jens
你解决了它!在我的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 |
+------------+
我只是尝试这样做: 'SELECT RIGHT( '0000000000' + CONVERT(VARCHAR(10),checknbr),10) FROM payhistory 其中number = 3861821' ,它在原来的职位产生完全相同的结果。 当没有值时,Checknbr是一个空字符串。该列中没有空值。 – LegalEagle
你如何观测结果? –