簡體   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