我在存储过程中具有以下代码,并且正在尝试根据其长度有条件地格式化计算所得的数字(如果该数字小于4位,则用前导零填充)。但是,我的案例陈述不起作用。我正在寻找“ formattedNumber2”结果。
我假设case语句奇怪地对待变量,但是我也不知道如何解决这个问题。
DECLARE @Number int = 5
SELECT
CASE
WHEN (LEN(CONVERT(VARCHAR, @Number)) > 4)
THEN @Number
ELSE RIGHT('0000' + CAST(@Number AS VARCHAR(4)), 4)
END AS formattedNumber,
LEN(CONVERT(VARCHAR, @Number)) AS numberLength,
RIGHT('0000' + CAST(@Number AS VARCHAR(4)), 4) AS formattedNumber2
运行查询时,我得到以下结果:
formattedNumber numberLength formattedNumber2
-------------------------------------------------
5 1 0005
答案 0 :(得分:2)
问题是您在case,integer和string上使用了不同的数据类型。因此CASE
会保留他找到的第一种类型,然后将其余的转换。
CASE WHEN (LEN(convert(VARCHAR, @Number)) > 4) THEN convert(VARCHAR, @Number)
答案 1 :(得分:0)
自2012年以来,使用format()
可以轻松得多。
format(n,
'0000')
这还将处理负值,而您当前的方法显然无法做到这一点。
2012年之前的版本,基本上可以使用replicate()
和+
(字符串串联)进行处理。
isnull(replicate('-',
-sign(n)), '')
+
isnull(replicate('0',
4
-
len(cast(abs(n) AS varchar(10)))
),
'')
+
cast(abs(n) AS varchar(10))
(它的目标是integer
值,为varchar
的{{1}}强制类型选择更大的长度。)