我正在使用SQL Server 2008。
我有一个包含校验码的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 :(得分:3)
如果您使用的是SQL Server 2012或更高版本,请尝试以下操作:
SELECT RIGHT(CONCAT('0000000000', checknbr), 10)
Concat会自动将NULL
值转换为空字符串,无需额外检查。
顺便说一下,您遇到的问题是,您的查询仍将checknbr
视为数字而非varchar
值。将其转换为varchar
将为您解决此问题。
编辑SQL Server 2008:
由于您有一个没有NULL值的VARCHAR列,因此唯一可以想到的是尾随空格。尝试:
SELECT RIGHT('0000000000' + RTRIM(checknbr), 10);
答案 1 :(得分:0)
使用cast()
或convert()
将checknbr
转换为字符值将解决'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 |
+------------+