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 |
+------------+
我正在使用 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 |
+------------+