繁体   English   中英

从十进制数中删除尾随零

[英]Remove trailing zero from decimal number

我有一个名为Amount的数据库表字段,其类型为十进制(18,6)。 所以它存储在数据库中,最多6个小数点,如9.786534但是当使用select查询检索该字段时,我必须小心,如下

  1. 删除trialling zero,例如,如果number为9.230000,则结果仅为9.23
  2. 如果小数点全为零,则仅删除四个试验零,例如,如果数字为9.000000,则结果为9.00

  3. 如果有零件,则结果最多为2位小数。

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

从EmployeeMaster中选择TOP 1金额

然后它给出了9.230000

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

请帮我..

它适用于删除尾随零,但我仍然无法在此方法中将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 

来自小数(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都支持这一点,但很多人都支持。

这应该工作

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

这有用吗?

select TOP 1 ROUND(Amount, 2) From EmployeeMaster 

尝试下面提到的代码。

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

希望它能按预期工作。

另一种方法:

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,不确定其他类型)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM