我想删除十进制记录的前零和后零(例如:记录0.0800的.08)。这很好。
SELECT REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0')
但是,当我尝试将其与案例一起使用时,它仅删除了结尾的零。
DECLARE @char int = 1
SELECT
CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0')
ELSE 0.01
END
给出0.08,而我期望为.08
但是,这个数字是0.08
DECLARE @char int = 1
SELECT
CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0')
ELSE cast(cast(0.01 as decimal(6,2)) as varchar)
END
有人可以解释原因吗?我是在想。
答案 0 :(得分:3)
从以下类型的集合中返回最高优先级类型 result_expressions和可选的else_result_expression。
正如您在Data type precedence (Transact-SQL)中发现的那样,任何数字数据类型的优先级都比任何varchar
类型的优先级高,因此:
CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0')
ELSE 0.01
END
将返回与0.01
相同的数据类型。
这意味着尽管REPLACE()
函数返回了.08
,但是它会隐式转换为0.08
,这就是您所看到的。
在查询的第二版中,CASE
语句的所有分支都返回相同的数据类型,因为ELSE
部分返回了varchar
,所以语句的返回类型为{{1} },这样您就会看到期望的结果:varchar
答案 1 :(得分:1)
这确实属于表示层。也就是说,还有一种替代方法,您可以将数字格式化为字符串。
请注意,format()
具有一些强大的功能,但性能可能会受到损害。
示例
Select format(0.080,'#.######')
返回
.08