2011-04-25 143 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值。

我自己,我会修复这个模式,因为从长远来看它会更好。我只是提供其他解决方案,因为你无法做到这一点。