如果不明确 Id,替换前导零不起作用


  • 我正在使用SQL Server 2012。

我正在更新表中名为PostNumber的列以放置前导零。它的数据类型是 nvarchar(50(。它应该始终是 6 位数字。如果不是六,则应用前导零填充。我尝试过使用以下 T-SQL:

update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)

初始表1为:

Id   PostNumber
1       234
2      24545
3     435434

我们需要做什么:

Id   PostNumber
1      000234
2      024545
3      435434

非常奇怪的是,它不适用于以前的 T-SQL!除非我们明确设置 Id..

update table1
set PostNumber=RIGHT('000000'+ISNULL(PostNumber,''),6)
where Id between 1 and 3

最后一个T-SQL工作,但我不知道为什么以前的T-SQL不起作用!该表保持不变,根本不放置任何零。你能提供一个可能的原因吗?谢谢。 我真的需要在不明确 ID 的情况下进行批量更新。

您的实际问题

如果列PostNumber为数值类型,则值123将与值000123相同。前导零是字符串类型的问题,或者 - 在大多数情况下,您只需要在表示层中提供某些内容。

更新 没有仔细阅读...

在您声明的评论中,该专栏是一个nvarchar(50)

可能是,你的值周围有空白,试试这个:

set PostNumber=RIGHT('000000'+ISNULL(LTRIM(RTRIM(PostNumber)),''),6)

检查与

SELECT PostNumber,LEN(PostNumber),DATALENGTH(PostNumber) FROM ...

填充方法

有几种方法,我更喜欢REPLACE的方法STR

DECLARE @number INT=34;
SELECT REPLACE(STR(@number,6),' ','0')

RIGHT非常常见的方法的问题在于,如果数字超过位数,它将返回不良结果。

DECLARE @number6 INT=123456;
SELECT REPLACE(STR(@number6,6),' ','0')
,RIGHT('000000'+ISNULL(@number6,''),6);
DECLARE @number7 INT=1234567;
SELECT REPLACE(STR(@number7,6),' ','0')
,RIGHT('000000'+ISNULL(@number7,''),6);

老实说:我最喜欢的方法有一个缺点,即负数:

DECLARE @numberMinus INT=-15;
SELECT REPLACE(STR(@numberMinus,6),' ','0')
,RIGHT('000000'+ISNULL(@numberMinus,''),6);

从 SQL-Server 2012 开始,有FORMAT()

SELECT FORMAT(@number,'000000')

不是最好的表演者,但效果很好。

最新更新