Does the CASE expression treat variables differently from columns?
14:17 28 Aug 2018

I have the following code in a stored procedure and am trying to conditionally format a calculated number based on its length (if the number is less than 4 digits, pad with leading zeros). However, my case expression is not working. The "formattedNumber2" result is the one I'm looking for.

I'm assuming the case expression treats the variable strangely, but I also don't know of a way around this.

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

I get the following results when I run the query:

formattedNumber   numberLength  formattedNumber2
-------------------------------------------------
         5             1              0005
sql sql-server case