SQL CASE语句是否将变量与列区别对待?

时间:2018-08-28 20:19:46

标签: sql sql-server case

我在存储过程中具有以下代码,并且正在尝试根据其长度有条件地格式化计算所得的数字(如果该数字小于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

2 个答案:

答案 0 :(得分:2)

SQL DEMO

问题是您在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}}强制类型选择更大的长度。)

db<>fiddle