删除case语句中的尾随零

时间:2019-06-17 12:44:57

标签: sql tsql

我一直在尝试从表的列中删除结尾的零。当我尝试从列中删除零时,它工作得很好。但是,当我将它与case语句一起使用(在打开标志时删除零,并在关闭标志时保留零)时,它不能正常工作。它无法识别该标志。例如,我已经将该列硬编码为一个常量值;而1 = 0(否)时,它正在检索除去零的值。在else语句中应该是正确的。

SELECT CASE WHEN 1=0 THEN cast(CAST(123.45000 AS decimal(6,2)) as float)  
ELSE   
'123.456700'   
END


SELECT CASE WHEN 1=0 THEN CONVERT(DOUBLE PRECISION, 123.456700) 
ELSE   
'123.456700'   
END

为什么会这样?有人可以帮我吗?

上面的@Tim很好地解释了上面的内容。

但是,它根本不会删除表中的零。它根本不识别该标志。这是一个示例:

CREATE TABLE #tablea 
(item CHAR(2), name VARCHAR(10), amount DECIMAL(9,2)) 

INSERT INTO #tablea 
VALUES ('AB', 'D1', 1.10), 
       ('AB', 'D2', 1.00), 
       ('AB', 'D3', 0.90), 
       ('AB', 'D4', 0.09)    

DECLARE @flag INT = 1

SELECT CASE WHEN @flag = 1 
THEN CAST(CAST(amount AS DECIMAL(6,2)) AS VARCHAR(max))
ELSE amount END 
FROM #tablea 

3 个答案:

答案 0 :(得分:3)

正如@JNevill所评论的那样,这里发生的是在ELSE表达式的CASE分支中发生了隐式转换,将字符串文字转换为浮点数,从而在出现时删除了结尾的零它被打印出来。一种选择是将IF部分投射到VARCHAR

SELECT
    CASE WHEN 1=0
         THEN CAST(CAST(123.45000 AS decimal(6,2)) AS varchar(max))  -- a string
         ELSE '123.456700' END  -- also a string

Demo

请注意,在某些版本的SQL(而不是您的SQL)中,您的CASE表达式甚至不会在没有错误的情况下运行。碰巧的是,这里发生了静默转换。

答案 1 :(得分:1)

您无法从decimal数据类型中删除尾随零。 decimal/numeric数据类型是定点数据类型:

  

具有固定精度和小数位数的数值数据类型。小数和数字是同义词,可以互换使用。

这意味着小数点位于存储的数字内的固定位置,这与floatread是浮点数据类型不同,因此对于decimal(9,2)来说,总是是小数点右边的两位数字-对于numeric(5,3)总是总是小数点左边的三位数。

如果精度不是很重要,则可以转换为float-但应注意,decimalfloat不同,是近似数据类型。
请注意,您仍然必须将case语句的两个分支都转换为varhcar,否则SQL Server会将两个分支都隐式转换为float,并且看起来该标志被忽略了。

DECLARE @flag INT = 1

SELECT 
        CASE WHEN @flag = 1 
            THEN CAST(CAST(amount AS float) as varchar(30))
            ELSE CAST(amount as varchar(30)) 
        END As [Remove trailing zeros],

        -- This is to show the opposite branch
        CASE WHEN @flag = 0 
            THEN CAST(CAST(amount AS float) as varchar(30))
            ELSE CAST(amount as varchar(30)) 
        END As [Include trailing zeros]
FROM #tablea         

结果:

Remove trailing zeros   Include trailing zeros
1.1                     1.10
1                       1.00
0.9                     0.90
0.09                    0.09

答案 2 :(得分:0)

@Tim,谢谢。它可以在您演示的演示中使用。但是它根本不会删除表中的零。它根本不识别该标志。这是一个示例:

crossAxisAlignment: CrossAxisAlignment.stretch