将ISNULL合并到CASE表达式中

时间:2013-01-24 14:47:29

标签: sql-server-2008 isnull

我有以下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

2 个答案:

答案 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/