2017-08-07 2 views
0

Ich habe ein Szenario, in dem ich '-' anzeigen muss, wenn der Wert null und numerische Daten wenn nicht null ist. Ich habe eine Funktion erstellt, die das handhabt. Unten ist der Clip des gleichen.Bedingtes Dezimalformat Formatierung

DECLARE @response varchar(max) 

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

     RETURN @response 

Ich brauche Antwort wie unten

@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 

ich unter Klausel versucht, die aber nicht in meiner Abfrage funktioniert tun.

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

Bitte schlagen Sie etwas vor, das das lösen kann. Versuchte Google.

+5

Ich weiß nicht Welche Datenbank Sie verwenden, ist die Art der Sache, die normalerweise am besten in der Präsentationsebene behandelt wird. Z.B. Wenn Sie Java auf einer SQL-Datenbank verwenden würden, hätten Sie viele praktische Funktionen, um die gewünschte Formatierung zu erhalten. –

+0

Wenn ich @TimBiegeleisen 100 mal kommentieren könnte würde ich. Speichern Sie nicht das genaue Format, das Sie benötigen, speichern Sie die Nummer. Wenn Sie es ziehen, formatieren Sie es dann. Andernfalls wirst du gezwungen sein, eine Nummer als Text zu speichern und jedes Mal, wenn du damit klarkommst, wirst du es umwandeln müssen. Es ist teurer Speicher und teurer Abruf. – JNevill

+0

@TimBiegeleisen, korrekt sollte ich das alles in Presentation Layer behandeln. aber derzeit in einer Sackgasse. Wird sich definitiv in meinem nächsten Update ändern. –

Antwort

1

können Sie die case erweitern:

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; 

würde ich darüber vorsichtig sein, vor allem, wenn @data als Gleitkommazahl gespeichert wird. Wie willst du 11.001 dargestellt werden? 11.0000001?

Vielleicht möchten:

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

Danke, das war hilfreich. Der erste funktionierte für mich. Wenn die Daten 11,001 sind, dann sollten die Daten 11,001 sein. –

0

Sie können diese Runde und Decken Funktion wie verwenden. Ich überlasse es bis zu Ihnen, wie Sie es in Ihren Code integrieren möchten:

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

Späte Antwort, aber wenn 2012+, eine weitere Option Format()

Beispiel

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 

Rückgabe

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