从十进制数中删除尾随零

问题描述:

我有一个名为Amount的数据库表字段,其类型是十进制(18,6)。所以它存储在数据库中多达6个像9.786534小数点但在使用select查询检索的那场,我必须照顾好样下面从十进制数中删除尾随零

  1. 删除试用零例如,如果数量为9.230000那么结果只有9.23
  2. 如果小数点全部为零,那么只能删除四个试验零值,例如,如果数字是9.000000,则结果是9.00

  3. 如果试验结果为零,结果最多为2位小数点。

如果我们写了简单的查询像

选择TOP 1金额从EmployeeMaster

然后它给9.230000

,但我的意图是要删除尾随零..

请帮我..

+1

所以你的意思是,如果你有9.234000那么它必须返回3位小数,即9.234? – Marshal 2012-04-27 05:29:07

+0

[删除SQL Server中十进制的尾随零]可能的重复(http://*.com/questions/2938296/remove-trailing-zeros-from-decimal-in-sql-server) – Farside 2016-05-03 14:10:32

这是行不通的?

select TOP 1 ROUND(Amount, 2) From EmployeeMaster 
+0

不,我试试这个,但是这不是我需要的实际结果,因为ROUND会舍入最接近的整数而不会删除试验零... – 2012-04-27 05:47:14

TRY下面提到的代码。

SELECT TOP 1 CONVERT(DECIMAL(10,2),Amount) From EmployeeMaster 

希望它能按预期工作。

它可以消除尾随零,但我仍然无法在此方法中将9转换为9.00

Declare @myvalue varchar(50), 
     @Price Varchar(50) 

Set @Price = '9.230000' 

set @Myvalue = reverse(substring(@Price,patindex('%.%',@Price)+1,len(@Price))) 


SELECT 
case 
When patindex('%.%[1-9]%',@price) = 0 Then 
    substring(@price,1,patindex('%.%',@price)-1) 
else 
    substring(@price,1,patindex('%.%',@price)-1) + '.' + Reverse(substring(@Myvalue,patindex('%[1-9]%',@Myvalue),len(@Myvalue))) 
END 
+1

谢谢你,这是最接近我的实际结果.. – 2012-04-27 05:51:54

从十进制(18,6),你可以做的来了...

select cast(Amount as decimal(18,2)) 

支持CAST功能大多数数据库将圆的数量,同时将其转换。在SQLServer上,如果我想四舍五入,这是我会做的。

如果你真的想要的是只有两个数字的字符串小数点后,那么你可以

select cast((Amount as decimal(18,2)) as nvarchar) 

nvarchar的是SQLServer的的可变长度的Unicode类型。数据库对字符串类型不太了解。您的数据库可能有不同的数据库。该sql的其余部分是ANSI标准。并非所有的dbs都支持这一点,但很多人都这样做

的另一种方法:

1)十进制转换为字符串;

2)将字符串拆分为2部分,将最后4个字符与字符串其余部分分开;

3)删除最后4个字符的尾部零;

4)将两部分连接在一起。

WITH data (V)  AS (SELECT CAST(9.786534 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.78653 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.7800 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.7  AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.00000 AS decimal(18,6)) 
        ) 

, AsString (V) AS (SELECT CAST(V AS varchar) FROM data) 

, Split (L, R) AS (SELECT LEFT(V, LEN(V) - 4), RIGHT(V, 4) FROM AsString) 

, Adjusted  AS (SELECT L, 
          REPLACE(RTRIM(REPLACE(R, '0', ' ')), ' ', '0') AS R 
         FROM Split) 

SELECT Result = L + R FROM Adjusted 

以上脚本的输出是:

Result 
-------- 
9.786534 
9.78653 
9.78 
9.70 
9.00 

我猜你的情况下,使用PATINDEX:

CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN 
    LTRIM(SUBSTRING(STR(Amount, 18, 6), 1, LEN(STR(Amount, 18, 6)) - PATINDEX('%[^0]%', REVERSE(str(Amount, 18, 6))) + 1)) 
    ELSE STR(Amount,18,2) 
END 

decimal(18,6)领域这应该工作:

select trim(to_char(Amount, '999999999999999999.99')) from EmployeeMaster 

(至少对于Oracle来说,不知道其他类型)

这应该工作

SELECT CAST(REPLACE(RTRIM(REPLACE(CAST(CAST(33.9082976 AS DECIMAL(38,8)) AS NVARCHAR(256)),'0',' ')),' ','0') AS FLOAT)