SQL计算机列公式

| SQL表(交易)具有三个字段AvgProfit,MinProfit和Hold-Hold是计算列... 如果AvgProfit MinProfit,保持= \'交易\' Hold的计算列公式如下。
 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有时为空,并且当表引用Hold公式时,这将导致错误
\'Error Converting varchar to numeric\'
如何将IS NULL或EMPTY添加到上述公式中,ISNULL不能捕获AvgProfit = \'\'??     
已邀请:
根据paxdiablo的建议,考虑使用十进制或数字列键入数据库。将这些列设置为varchar是否有原因? 或者,如果您必须保留varchar列,请尝试ISNUMERIC(),http://msdn.microsoft.com/zh-cn/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
或类似的东西。     
varchar
列应用于可变大小的CHARacter列,而不用于数字数据。 换句话说,它们不应为空(当然,除了NULL以外,但您已经做好了处理)。 如果由于某种原因无法解决一些疏忽,可以通过执行以下操作使查询变得更加复杂和缓慢:-):
select case when xyz = \'\' then 0 when isnull(xyz) then 0 else xyz end ...
换句话说,检查NULL和空的“ 4”值。 我本人会修复该架构,因为从长远来看,它将对您更好。我只是提供其他解决方案,以防止您无法这样做。     

要回复问题请先登录注册