[英]Remove trailing zero from decimal number
我有一个名为Amount的数据库表字段,其类型为十进制(18,6)。 所以它存储在数据库中,最多6个小数点,如9.786534但是当使用select查询检索该字段时,我必须小心,如下
如果小数点全为零,则仅删除四个试验零,例如,如果数字为9.000000,则结果为9.00
如果有零件,则结果最多为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.