删除前导和尾随零以及一个案例

时间:2019-06-28 18:50:57

标签: sql-server tsql case

我想删除十进制记录的前零和后零(例如:记录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 

有人可以解释原因吗?我是在想。

2 个答案:

答案 0 :(得分:3)

来自CASE (Transact-SQL)

  

从以下类型的集合中返回最高优先级类型   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