SQL Server:然后当When为false时执行?

时间:2014-06-11 19:05:18

标签: sql case

我有以下案例陈述

case 
   when [cross].WEIGHT is not null and len([cross].WEIGHT) > 0
      then [cross].WEIGHT
   when pricesvc.INDV_WEIGHT is not null and len(pricesvc.INDV_WEIGHT) > 0
      then pricesvc.INDV_WEIGHT
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 and pricesvc.PS_LGCY_QTY3 is not null and len(pricesvc.PS_LGCY_QTY3) > 1 and right(pricesvc.PS_LGCY_QTY3,1) = 'M'
      then CONVERT(FLOAT, REPLACE([pricesvc].[PKG_WEIGHT],',','')) / (CONVERT(FLOAT, REPLACE(left([pricesvc].[PS_LGCY_QTY3],len([pricesvc].[PS_LGCY_QTY3])-1),',','')) * 10000)
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 and pricesvc.PS_LGCY_QTY3 is not null and len(pricesvc.PS_LGCY_QTY3) > 0 
      then CONVERT(FLOAT, REPLACE([pricesvc].[PKG_WEIGHT],',','')) / CONVERT(FLOAT, REPLACE([pricesvc].[PS_LGCY_QTY3],',',''))
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 
      then pricesvc.PKG_WEIGHT
   else '0.01'
end as 'weight',

第一个when为真,但第三个when/then仍然执行并抛出错误

  

Msg 8114,Level 16,State 5,Line 1
  将数据类型varchar转换为float时出错。

我为null和零长度添加了When测试,但then转换仍然执行并出错。看起来很奇怪,因为我认为不会执行错误的条件

1 个答案:

答案 0 :(得分:1)

在你的Else子句中有0.01而不是varchar' 0.01'看看是否有帮助。此外,[cross] .WEIGHT和pricesvc.INDV_WEIGHT和pricesvc.PKG_WEIGHT的数据类型是什么?您还需要将它们转换为浮点数。本质上,错误不是因为第三个条件正在执行它,因为您的SQL无法解析,因为您的case语句的结果中有不同的数据类型无法隐式转换。

试试这个 -

case 
   when [cross].WEIGHT is not null and len([cross].WEIGHT) > 0
      then CONVERT(FLOAT, REPLACE([cross].WEIGHT,',',''))
   when pricesvc.INDV_WEIGHT is not null and len(pricesvc.INDV_WEIGHT) > 0
      then then CONVERT(FLOAT, REPLACE(pricesvc.INDV_WEIGHT,',','')) 
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 and pricesvc.PS_LGCY_QTY3 is not null and len(pricesvc.PS_LGCY_QTY3) > 1 and right(pricesvc.PS_LGCY_QTY3,1) = 'M'
      then CONVERT(FLOAT, REPLACE([pricesvc].[PKG_WEIGHT],',','')) / (CONVERT(FLOAT, REPLACE(left([pricesvc].[PS_LGCY_QTY3],len([pricesvc].[PS_LGCY_QTY3])-1),',','')) * 10000)
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 and pricesvc.PS_LGCY_QTY3 is not null and len(pricesvc.PS_LGCY_QTY3) > 0 
      then CONVERT(FLOAT, REPLACE([pricesvc].[PKG_WEIGHT],',','')) / CONVERT(FLOAT, REPLACE([pricesvc].[PS_LGCY_QTY3],',',''))
   when pricesvc.PKG_WEIGHT is not null and len(pricesvc.PKG_WEIGHT) > 0 
      then pricesvc.PKG_WEIGHT
   else 0.01
end as 'weight',`