SQL将AND放在OR中

时间:2014-08-28 12:02:58

标签: sql sql-server tsql

我试图根据以下内容添加条件:

where new.Number <> old.Number
and new.Number is not null

这会选择具有已更改数字的行&#39;只要新号码&#39;不是空白

我想添加另一个条件,可以用作&#39; OR&#39;的另一面。但我很困惑如何做到这一点,我的大脑说:

where (((new.Number <> old.Number) and new.Number is not null) or (new condition))

因此,我们会选择通过先前条件的行或传递新条件,但这似乎不起作用。

4 个答案:

答案 0 :(得分:2)

修订答案

假设您 DO 想要包含涉及NULL的结果,您有两个选择:

选项1

智能地使用 OR 条款:

WHERE old.Number IS NULL OR old.Number <> new.Number

匹配如果:

  1. 旧号码为NULL
  2. 或两个数字都不是NULL且不同
  3. 这在所有其他情况下都不匹配,包括:

    1. 旧号码不为空
    2. 新号码为NULL或两个号码相同
    3. 选项2

      使用ISNULL函数比较NULL值,如下所示:

      WHERE ISNULL(new.Number, -1) <> ISNULL(old.number, -1)
      

      匹配如果:

      1. 两个数字都不同(例如1 <> 2
      2. 或其中一个数字为NULL(例如1 <> NULLNULL <> 2
      3. 如果符合以下条件,则不匹配:

        1. 两个数字相同(例如1 <> 1
        2. 或两个数字均为NULL(例如NULL <> NULL

        3. 在任何情况下,当您混合使用AND和OR子句时,可以使用()

答案 1 :(得分:0)

也许你可以将第一个条件重写为WHERE new.Number NOT IN(null,old.Number),使其成为单个表达式,这可以使'OR'更容易。

另外,在没有新条件的情况下,您是否完全确定该功能是否正确? 对我们来说,无法检查,因为没有关于您选择的表的上下文。

答案 2 :(得分:0)

你可以尝试这个...... WHERE(new.Number&lt;&gt; old.Number AND new.Number IS NOT NULL)或(新条件)

答案 3 :(得分:0)

如前所述,您可以合并原始条件以删除is not null。但是,我仍然希望明确这个意图,因此我更喜欢这种模式:

coalesce(new.Number, old.Number) <> old.Number

这使得未来的维护者更清楚地明确考虑了你想用NULL值做什么,它仍然会将你压缩到一个你可以轻松地与ar OR结合的表达式。

但是在将来,如果你有更复杂的条件不能巩固,只需记住你的括号:

WHERE ( new.Number <> old.Number and new.Number is not null )
     OR ( other condition )