2012-04-27 79 views
4

我有一個名爲Amount的數據庫表字段,其類型是十進制(18,6)。所以它存儲在數據庫中多達6個像9.786534小數點但在使用select查詢檢索的那場,我必須照顧好樣下面從十進制數中刪除尾隨零

  1. 刪除試用零例如,如果數量爲9.230000那麼結果只有9.23
  2. 如果小數點全部爲零,那麼只能刪除四個試驗零值,例如,如果數字是9.000000,則結果是9.00

  3. 如果試驗結果爲零,結果最多爲2位小數點。

如果我們寫了簡單的查詢像

選擇TOP 1金額從EmployeeMaster

然後它給9.230000

,但我的意圖是要刪除尾隨零..

請幫我..

+1

所以你的意思是,如果你有9.234000那麼它必須返回3位小數,即9.234? – Marshal 2012-04-27 05:29:07

+0

[刪除SQL Server中十進制的尾隨零]可能的重複(http://stackoverflow.com/questions/2938296/remove-trailing-zeros-from-decimal-in-sql-server) – Farside 2016-05-03 14:10:32

回答

0

這是行不通的?

select TOP 1 ROUND(Amount, 2) From EmployeeMaster 
+0

不,我試試這個,但是這不是我需要的實際結果,因爲ROUND會舍入最接近的整數而不會刪除試驗零... – 2012-04-27 05:47:14

0

TRY下面提到的代碼。

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

希望它能按預期工作。

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

謝謝你,這是最接近我的實際結果.. – 2012-04-27 05:51:54

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都支持這一點,但很多人都這樣做

0

的另一種方法:

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 
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 
0

decimal(18,6)領域這應該工作:

select trim(to_char(Amount, '999999999999999999.99')) from EmployeeMaster 

(至少對於Oracle來說,不知道其他類型)

1

這應該工作

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