Sql server 2008 将ISNULL合并到大小写表达式中

Sql server 2008 将ISNULL合并到大小写表达式中,sql-server-2008,isnull,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 是一个表达式,而不是一个语句。这是一个微妙的挑剔,但区别是重要的 我想你的意思是: CASE WHEN [2010] IS NULL THEN 0 END 但这根本没有任

我有以下
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
是一个表达式,而不是一个语句。这是一个微妙的挑剔,但区别是重要的

我想你的意思是:

CASE WHEN [2010] IS NULL THEN 0 END
但这根本没有任何意义,除非您在那里硬编码2010,但计划稍后使用变量或列名

与你所追求的完全不同(至少据我所知)。它的工作方式与Access不同。出于这个原因,我通常会推荐它,在大多数情况下,它的功能类似。我去年写了这个技巧来帮助区分:


不幸的是,您使用的
IsNull()
函数错误。如果要测试列是否为空,则将使用:

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)
替换该
大小写
表达式:

IsNull([2010], 0)
* 
CASE 
  WHEN IsNumeric([Dur_In_Hours]) =1 
  THEN CAST([Dur_In_Hours] AS FLOAT) 
  ELSE 0 
END AS Cost
或者您可以使用
合并
替换第一个
案例

COALESCE([2010], 0)
* 
CASE 
  WHEN IsNumeric([Dur_In_Hours]) =1 
  THEN CAST([Dur_In_Hours] AS FLOAT) 
  ELSE 0 
END AS Cost

此外,解释“不注册”之类的含义也很有用。你收到错误信息了吗?如果是,那是什么?那么它是一个糟糕的列名。它不仅以数字开头(这意味着它必须总是用
[方括号]转义)
,但它也要求标准化,而且一点也不描述性。这是2010年的事情,但又是什么呢?最后,为什么要将持续时间以小时为单位存储在基于字符串的列中?为什么要将可能是整数或2位小数乘以整数的值转换为浮点值?我把它归结为“CASE WHEN[2010]如果为空,则将0转换为浮点值([2010]转换为浮点值)*如果为数字([Dur_In_h])=1,则将[Dur_In_h]转换为浮点值,否则0结束)作为“成本”,我无法解析查询Text@Andrew第一个
CASE
语句中缺少
END
。您必须始终有
CASE..WHEN..THEN..END
这都是一个大型CASE语句,但我尝试添加END,但没有添加work@Andrew然后你应该发布完整的声明查询的各个部分将使调试变得困难。此外,您应该格式化查询,这将帮助您找到问题。什么工具说“无法分析查询文本”?也许你应该停止使用该工具,我不认为这对你有任何好处。在Management Studio中启用IntelliSense的适当查询窗口将突出显示所有这些琐碎和重复的语法错误。。。