Not In和<>之间的差异或<>

时间:2015-06-25 15:42:15

标签: sql sql-server sql-server-2008 sql-server-2008-r2

以下2个代码有什么不同,我的输出差异很大。

1)

SUM( 
CASE 
WHEN lientype.id NOT IN (-1, -3) THEN 
  ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
  ELSE 0 
END)/NULLIF(sum( 
CASE 
WHEN lientype.id NOT IN (-1, 
                         -3) THEN 
  (pos.marketvalue) 
  ELSE 0 
END),0) averagecoupon

2)

SUM( 
CASE 
WHEN ( 
    lientype.id<>-1 
    OR 
    lientype.id<>-3 
  ) 
  THEN 
  ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
  ELSE 0 
END)/NULLIF(sum( 
CASE 
WHEN ( 
    lientype.id<>-1 
    OR 
    lientype.id<>-3 
  ) 
  THEN 
  (pos.marketvalue) 
  ELSE 0 
END),0) averagecoupon

5 个答案:

答案 0 :(得分:2)

您案件的NOT IN应转换为<> -1 AND <> -3<> -1 OR <> -3大致转换为NOT IN (-1) OR NOT IN (-3),因此输出会有很大不同。

答案 1 :(得分:1)

此:

lientype.id<>-1 
OR 
lientype.id<>-3 

应该是:

lientype.id<>-1 
AND
lientype.id<>-3 

以便等同于:

lientype.id NOT IN (-1, -3)

你现在正在做的只是说lientype.id is not -1 or it is not -3,但显然它不能同时等于这两个值,所以它总是true

答案 2 :(得分:0)

当A和B本身不相等时,所有值都是

不等于A

不等于B

就像在说,“给我一切不是-1的东西,以及那些不是-3的东西。”这跟一切都一样。

这是一项无意义的检查,可以省略。

其中,NOT IN (A, B)

相当于除A或B之外的所有东西。

在你的片段中,你可以次优地写,

WHEN NOT (lientype.id = -1 OR lientype.id = -3)

作为

的直接逻辑替代品
WHEN lientype.id NOT IN (-1, -3)

答案 3 :(得分:0)

表达式:

lientype.id NOT IN (-1, -3)

相当于:

NOT (lientype.id = -1 OR lientype.id = -3)

也相当于:

lientype.id != -1 AND lientype.id != -3

lientype.id <> -1 AND lientype.id <> -3

当您将NOT分配到括号中的内容时,您需要将所有布尔逻辑和比较运算符“翻转”在一起(AND -> OROR -> AND,{{1 }和= -> !=)。您已颠倒了相等运算符(!= -> =),但没有反转布尔值= -> <>

答案 4 :(得分:0)

晚会但您仍然可以使用OR,但需要使用=并切换THENEND

SELECT
SUM( CASE 
     WHEN ( 
        lientype.id=-1 
        OR 
        lientype.id=-3 
      ) 
     THEN 0
     ELSE ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
     END)
/NULLIF(SUM( 
     CASE 
     WHEN ( 
        lientype.id=-1 
        OR 
        lientype.id=-3 
        ) 
     THEN 0
     ELSE
        (pos.marketvalue) 
     END),0) averagecoupon -- DIVIDE BY ZERO?