2017-08-07 44 views
0

我有一個場景,我需要顯示' - '如果值爲空,並且數值數據如果不爲空。我已經創建了一個處理這個的函數。下面是相同的剪輯。有條件的小數點位置格式

DECLARE @response varchar(max) 

set @response=Case when (@data is null) then '-' 
     else STR(@data,25,@roundUp) 
    end 

     RETURN @response 

我需要響應如下

@data=10258.69 and @roundUp=2 then @response=10258.69 
@data=10258.00 and @roundUp=2 then @response=10258 
@data=10258.695 and @roundUp=2 then @response=10258.70 
@data=10258.69485 and @roundUp=2 then @response=10258.69 

我嘗試以下條款,著作,但是沒有我的查詢。

select cast(CAST(round(10028.000,3) as decimal(18,5)) as float) 

請建議一些可以解決這個問題。試過谷歌。

+5

我不知道你正在使用什麼數據庫,但這是通常最好在表示層處理的事情。例如。如果您在SQL數據庫之上使用Java,則可以使用許多方便的功能爲您提供所需的格式。 –

+0

如果可以upvote @TimBiegeleisen評論100次我會。不要存儲你需要的確切格式,存儲號碼。當你拉它時,格式化它。否則,你將被迫以文本形式存儲一個數字,每當你處理它時,你都必須施放它。這是昂貴的存儲和昂貴的檢索。 – JNevill

+0

@TimBiegeleisen,我應該在表示層處理所有這些。但目前處於死鎖狀態。我的下一次更新肯定會改變。 –

回答

1

可以擴展case

set @response = (case when (@data is null) then '-' 
         when (@data = floor(@data)) then str(@data, 25, 0) 
         else STR(@data,25,@roundUp) 
       end); 
return @response; 

我會仔細考慮這點,特別是如果@data存儲爲一個浮點數。你想如何代表11.00111.0000001

你可能想:

set @response = (case when (@data is null) then '-' 
         when abs(@data - floor(@data)) < 0.001 then str(@data, 25, 0) 
         else STR(@data,25,@roundUp) 
       end); 
return @response; 
+0

謝謝,這很有幫助。第一個爲我工作。 如果數據是11.001,那麼數據應該是11.001。 –

0

您可以使用圓形,這樣的天花板功能。我離開你高達,你怎麼想它納入你的代碼:

Select round(Ceiling(10000*10258.69)/10000,2) 
Select round(Ceiling(10000*10258.00)/10000,2) 
Select round(Ceiling(10000*10258.695)/10000,2) 
Select round(Ceiling(10000*10258.69485)/10000,2) 
0

遲到的回答,但如果2012+,另一個選擇是格式()

Declare @YourTable table (SomeCol float) 
Insert Into @YourTable values 
(10258.69) 
,(10258.00) 
,(10258.695) 
,(10258.69485) 
,(null) 

Select * 
     ,Formatted = IsNull(Format(SomeCol,choose(sign(SomeCol-floor(SomeCol))+1,'0','0.00')),'-') 
From @YourTable 

退貨

SomeCol  Formatted 
10258.69 10258.69 
10258  10258 
10258.695 10258.70 
10258.69485 10258.69 
NULL  -