我一直在尝试从表的列中删除结尾的零。当我尝试从列中删除零时,它工作得很好。但是,当我将它与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
答案 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
请注意,在某些版本的SQL(而不是您的SQL)中,您的CASE
表达式甚至不会在没有错误的情况下运行。碰巧的是,这里发生了静默转换。
答案 1 :(得分:1)
您无法从decimal
数据类型中删除尾随零。 decimal/numeric
数据类型是定点数据类型:
具有固定精度和小数位数的数值数据类型。小数和数字是同义词,可以互换使用。
这意味着小数点位于存储的数字内的固定位置,这与float
和read
是浮点数据类型不同,因此对于decimal(9,2)
来说,总是是小数点右边的两位数字-对于numeric(5,3)
,总是总是小数点左边的三位数。
如果精度不是很重要,则可以转换为float
-但应注意,decimal
与float
不同,是近似数据类型。
请注意,您仍然必须将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