SQL 服务器用 RIGHT 填充 0 无效

SQL Server Padding 0's with RIGHT Not Working

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

提前致谢

如果您使用的是 SQL 服务器 2012 或更高版本,请尝试以下操作:

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

Concat 会自动将 NULL 值转换为空字符串,无需额外检查。

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

编辑SQL 服务器 2008:

由于您有一个没有 NULL 值的 VARCHAR 列,唯一仍然想到的是尾随空格。尝试:

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

使用cast()convert()checknbr转换为字符值将解决'0000000000'到整数0的隐式转换。

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

如果checknbr可以是null,而你希望它return为'0000000000',那么你可以把它换成coalesce()或[=25] =]:

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

如果 checknbr 不是数字,而是 varchar(30),那么(正如 Jens 指出的那样),您可能需要填充空格 trimmed:

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

returns:

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

如果你 trim 填充空格:

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

return秒:

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