【问题标题】:difference between Not In and <> or <>Not In 和 <> 或 <> 之间的区别
【发布时间】:2015-06-25 15:42:14
【问题描述】:

下面两个代码有什么不同吗,我的输出有很大的不同。

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

【问题讨论】:

  • 你应该用“and”而不是“or”, -1 或 -3 总是正确的
  • 您的问题的简单答案是“是”。不好的答案?不好的问题。
  • 如果输出存在巨大差异,那么是的,您可以推断出存在差异。
  • 列中间的那个标量函数很吓人。众所周知,标量函数不利于性能,并且当卡在这样的列中时,它们可能会造成严重后果。

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


【解决方案1】:

您的案例的NOT IN 应转换为&lt;&gt; -1 AND &lt;&gt; -3。拥有&lt;&gt; -1 OR &lt;&gt; -3 大致转换为NOT IN (-1) OR NOT IN (-3),因此输出会非常不同。

【讨论】:

  • @user5016908 - 如果它对您有帮助,请随时投票,如果它解决了您的问题,请接受它。这有助于其他人了解哪些答案可能有所帮助,以及是否有任何答案解决了您的问题。它还可以提高您的声誉。
【解决方案2】:

这个:

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

【讨论】:

    【解决方案3】:

    表达式:

    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 -&gt; OROR -&gt; AND= -&gt; !=!= -&gt; =) .您已经反转了相等运算符 (= -&gt; &lt;&gt;),但没有反转布尔值 OR

    【讨论】:

    • 只是添加 - id NOT IN (-1, -3)(id != -1 AND id != -3) 是绝对等价的,并且会被查询优化器同等对待,这将为两者生成相同的执行计划,所以最好使用 @ 987654334@ 语法,因为它更易于阅读。
    【解决方案4】:

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

    不等于 A

    不等于 B

    就像说,“给我所有不是-1 和所有不是-3 的东西。”一切都一样。

    这是一个可以省略的毫无意义的检查。

    在哪里,NOT IN (A, B)

    等价于除 A 或 B 之外的所有内容。

    在您的 sn-ps 中,您可以次优地编写,

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

    作为直接的逻辑替代

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

    【讨论】:

      【解决方案5】:

      聚会迟到了,但您仍然可以使用 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?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 2016-11-07
        • 2011-01-15
        相关资源
        最近更新 更多