2011-04-25 140 views
0

SQL表(工種)有三個字段AvgProfit,MinProfit和保持 - 保持是計算科拉姆...SQL計算機列公式

如果AvgProfit < MinProfit,保持= '保留',如果AvgProfit> MinProfit, Hold ='Trade' Hold的Comp計算公式如下。

SQL Table Trades 
AvgProfit varchar(35) 
MinProfit varchar(35) 
Hold varchar(35) 


(case when CONVERT([decimal](8,4),isnull([AvgProfit],(0)),(0))>=CONVERT([decimal](8,4),isnull([MinProfit],(0)),(0)) then 'Trade' else 'Hold' end) 

問題:更新造成AvgProfit是在次空,這將導致錯誤時引用表中保持公式

'Error Converting varchar to numeric' 

如何添加爲空白或空上面的公式,ISNULL不會捕獲AvgProfit =''??

+0

爲什麼要將AvgProfit和MinProfit作爲varchar存儲在第一位? – 2011-04-25 03:54:55

回答

0

考慮用paxdiablo建議的十進制或數字列鍵入數據庫。是否有理由將這些列設置爲varchar?

或者,如果您必須保留您的varchar列,請嘗試ISNUMERIC(),http://msdn.microsoft.com/en-us/library/ms186272.aspx。它適用於所有常見的SQL數字類型。所以,你可以查詢變成:

ISNUMERIC可以這樣使用:

select case when ISNUMERIC('123') = 1 then 1 else 0 end ' returns 1 
select case when ISNUMERIC('xyz') = 1 then 1 else 0 end ' returns 0 
select case when ISNUMERIC(null) = 1 then 1 else 0 end ' returns 0 

所以你的查詢可能會變成:

case when isnumeric(AvgProfit) = 1 THEN case([AvgProfit] as decimal) else 0 END 

或類似的東西。

0

varchar列應該用於可變大小的CHARACTER列,而不是用於數字數據的

換句話說,他們不應該空(除NULL之外,當然,但你已經注意到了這一點)。

如果你不能修復了某些原因,監督力度不大,可以做這樣的事情讓你的查詢更加複雜和緩慢:-):

select case when xyz = '' then 0 when isnull(xyz) then 0 else xyz end ... 

換句話說,同時檢查NULL 爲空varchar值。

我自己,我會修復這個模式,因爲從長遠來看它會更好。我只是提供其他解決方案,因爲你無法做到這一點。