[英]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.