首页 > 解决方案 > 删除case语句中的尾随零

问题描述

我一直在尝试从表的列中删除尾随零。当我尝试从列中删除零时效果很好。但是,当我将它与 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 

标签: sqltsql

解决方案


正如@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

演示

请注意,在某些 SQL 版本(您的除外)中,您的CASE表达式甚至不会在没有错误的情况下运行。碰巧这里正在发生无声的转变。


推荐阅读