我有以下CASE
表达式且ISNULL
部分未注册:
CASE WHEN IsNull(2010) THEN 0 END) *
CASE WHEN IsNumeric([Dur_In_Hours]) = 1 THEN
CAST([Dur_In_Hours] AS FLOAT) ELSE 0 END) AS Cost
答案 0 :(得分:5)
不幸的是,您使用的IsNull()
函数错误。如果您正在测试列是否为null,那么您将使用:
CASE
WHEN 2010 is null
THEN 0
END
*
CASE
WHEN IsNumeric([Dur_In_Hours]) =1
THEN CAST([Dur_In_Hours] AS FLOAT)
ELSE 0
END AS Cost
如果您想使用IsNull()
,则可以使用IsNull([2010], 0)
替换CASE
表达式:
IsNull([2010], 0)
*
CASE
WHEN IsNumeric([Dur_In_Hours]) =1
THEN CAST([Dur_In_Hours] AS FLOAT)
ELSE 0
END AS Cost
或者您可以使用COALESCE
替换第一个CASE
:
COALESCE([2010], 0)
*
CASE
WHEN IsNumeric([Dur_In_Hours]) =1
THEN CAST([Dur_In_Hours] AS FLOAT)
ELSE 0
END AS Cost
答案 1 :(得分:2)
CASE
是一个表达式,而不是一个陈述。这是一个微妙的挑选,但区别很重要。
我认为你的意思是:
CASE WHEN [2010] IS NULL THEN 0 END
但这根本没有任何意义,除非你在那里对2010进行硬编码,但是后来计划使用变量或列名。
ISNULL
与你所追求的完全不同(至少据我所知)。它的工作方式与Access中的工作方式不同。出于这个原因,我通常推荐COALESCE
,在大多数情况下其功能类似。我去年写了这篇小贴士来帮助区分:
http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/