【问题标题】:What is the difference between these two AND Operators in SQL Server?SQL Server 中这两个 AND 运算符有什么区别?
【发布时间】:2020-08-05 17:48:19
【问题描述】:
AND (
     (mmd.TerminationDate IS NOT NULL AND mmd.TerminationDate >= '01-Jan-2019')
     OR mmd.TerminationDate IS NULL
)
AND (mmd.TerminationDate IS NULL OR mmd.TerminationDate >= '01-Jan-2020')

【问题讨论】:

  • 你打错了吗?一个条件是 2020 年 1 月 1 日,而另一个是 2019 年 1 月 1 日
  • 您检查过查询计划吗?
  • 没有区别:假设 a = mmd.TerminationDate is NULL, b = mmd.TerminationDate >= '01-Jan-2019'。 (不是 a ∧ b) ∨ a = (不是 a ∨ a) ∧ (b ∨ a) = b ∨ a = a ∨ b。就布尔逻辑而言,这两个条件之间没有区别。

标签: sql sql-server tsql date where-clause


【解决方案1】:

假设文字日期应该是相同的,这两个条件做同样的事情 - 即,允许为空或大于 1 月 1 日的日期。

第一个表达式不必要地多余:

(mmd.TerminationDate is NOT NULL and mmd.TerminationDate >= '01-Jan-2019') 
or mmd.TerminationDate is null)

如果TerminationDatenull,那么它不能大于1 月1 日,所以第一个子条件实际上归结为mmd.TerminationDate >= '01-Jan-2019'

不相关的说明:虽然 SQL Server 在理解日期格式方面非常灵活,但我会使用更标准的格式来表示一月第一,例如:

mmd.TerminationDate is Null OR mmd.TerminationDate >= '2019-01-01'

【讨论】:

  • 有时这些冗余使 SQL Server 选择更好的执行计划和/或考虑过滤索引。
  • 您的答案是正确的,假设这两个条件都与 2019 年 1 月 1 日进行了检查,但在他的问题中,他将两个不同的查询与 2019 年另一个与 2020 年进行了比较。可能这就是他感到困惑的原因。
  • @GabrielDurac:啊,是的,你说得对,一开始我并没有注意到这一年的差异。我会认为这是一个错字 - 否则这个问题对我来说意义不大!
  • 旁白:你是说literal还是littoral?大流行使许多人想前往海滩。
  • @HABO: 啊啊好一个...谢谢。我想我经常犯这个错字。
【解决方案2】:

第一部分:

AND ((mmd.TerminationDate is NOT NULL and mmd.TerminationDate >= '01-Jan-2019') or mmd.TerminationDate is null)

这里验证了两件事:(mmd.TerminationDate is NOT NULL and mmd.TerminationDate >= '01-Jan-2019')这两个条件都应该是 True 否则它不是第二个条件(mmd.TerminationDate 是null) 应该是真的。

(mmd.TerminationDate is NOT NULL and mmd.TerminationDate >= '01-Jan-2019') :它正在检查终止日期不应为空且终止日期应等于或大于 '01-Jan- 2019'这个日期。这两个条件都应该为真,否则验证失败。

“或”之后的第二部分:

(mmd.TerminationDate is null) :这是验证终止日期不应为空,此列应具有任何日期值。

在这两个条件之间你使用了 'or' ,这意味着从这两个条件中任何人都应该符合条件才能获得记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2012-06-24
    • 2012-08-05
    • 2021-11-08
    • 2020-02-02
    • 2022-01-02
    相关资源
    最近更新 更多