我有一个名为Amount的数据库表字段,其类型为十进制(18,6)。所以它存储在数据库中,最多6个小数点,如9.786534但是当使用select查询检索该字段时,我必须像下面一样小心
如果小数点全为零,则只删除四个试验零,例如,如果数字为9.000000则结果为9.00
如果有零件,则结果最多为2位小数。
如果我们写简单的查询,如
从EmployeeMaster中选择TOP 1金额
然后它给出9.230000
但我的意图是删除尾随零..
请帮帮我..
答案 0 :(得分:1)
它适用于删除尾随零,但我仍然无法在此方法中将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 :(得分:1)
来自小数(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都支持,但很多人都支持。
答案 2 :(得分:1)
这应该有效
SELECT CAST(REPLACE(RTRIM(REPLACE(CAST(CAST(33.9082976 AS DECIMAL(38,8)) AS NVARCHAR(256)),'0',' ')),' ','0') AS FLOAT)
答案 3 :(得分:0)
这有用吗?
select TOP 1 ROUND(Amount, 2) From EmployeeMaster
答案 4 :(得分:0)
尝试下面提到的代码。
SELECT TOP 1 CONVERT(DECIMAL(10,2),Amount) From EmployeeMaster
希望它能按预期工作。
答案 5 :(得分:0)
另一种方法:
1)将小数转换为字符串;
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
答案 6 :(得分:0)
我想在你的情况下使用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
答案 7 :(得分:0)
对于decimal(18,6)
字段,这应该有效:
select trim(to_char(Amount, '999999999999999999.99')) from EmployeeMaster
(至少对于Oracle,不确定其他类型)