2017-08-07 2 views
0

J'ai un scénario où j'ai besoin d'afficher '-' si la valeur est null et les données numériques sinon null. J'ai créé une fonction qui gère cela. Ci-dessous est le clip de la même chose.Mise en forme décimale conditionnelle

DECLARE @response varchar(max) 

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

     RETURN @response 

J'ai besoin de réponse comme ci-dessous

@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 

J'ai essayé ci-dessous clause qui fonctionne mais ne pas dans ma requête.

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

Veuillez suggérer quelque chose qui peut résoudre ce problème. Essayé google.

+5

Je ne sais pas Voyez quelle base de données vous utilisez, mais c'est le genre de chose qui est généralement mieux géré dans la couche de présentation. Par exemple. Si vous utilisiez Java au-dessus d'une base de données SQL, vous auriez beaucoup de fonctions pratiques pour donner le format que vous voulez ici. –

+0

Si pourrait commentaire @TimBiegeleisen upvote 100 fois je le ferais. Ne stockez pas le format exact dont vous avez besoin, enregistrez le numéro. Lorsque vous le tirez, formatez-le ensuite. Sinon, vous serez obligé de stocker un nombre sous forme de texte et chaque fois que vous le traitez, vous devrez le lancer. C'est un stockage coûteux et une récupération coûteuse. – JNevill

+0

@TimBiegeleisen, correct Je devrais gérer tout cela dans la couche de présentation. mais actuellement dans une situation de verrouillage mort. Va certainement changer dans ma prochaine mise à jour. –

Répondre

1

Vous pouvez prolonger la 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; 

Je serais prudent à ce sujet, surtout si @data est stocké comme nombre à virgule flottante. Comment voulez-vous que 11.001 soit représenté? 11.0000001?

Vous pouvez:

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

Merci, c'était utile. Le premier a travaillé pour moi. Si les données sont 11.001, les données doivent être 11.001. –

0

Vous pouvez utiliser la fonction de ronde et plafond comme celui-ci. Je laisse jusqu'à vous, comment vous voulez incorporer dans votre code:

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

réponse tardive, mais si 2012+, une autre option est Format()

Exemple

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 

Retours

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