SQL Server填充0,右边不起作用

时间:2017-04-14 13:19:38

标签: sql-server padding string-concatenation

我正在使用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功能的怪癖吗?

提前致谢

2 个答案:

答案 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 |
+------------+