【问题标题】:Why do two seemingly identical where clauses involving nulls produce different results为什么涉及空值的两个看似相同的 where 子句会产生不同的结果
【发布时间】:2015-07-16 10:57:52
【问题描述】:

我正在尝试选择在特定列中没有空值且其值不在另一个表中的所有记录。

因此,在这种特殊情况下,我想从导入表中获取尚未在个人表中的所有“讲师”。显然我不想要任何空白的导师。我第一次尝试在 where 子句中使用:

(Instructor IS NOT NULL OR Instructor <> '')

但是结果仍然包括所有空白记录。当我尝试使用

ISNULL(Instructor, '') <> ''

我得到了想要的结果。我看不出这两个 where 子句如何可能产生不同的结果。在我看来,将值转换为空字符串以进行比较的 ISNULL 似乎与将列与 null 然后再与空字符串进行比较的结果完全相同。我在这里想念什么?我猜这与空值的奇怪性有关。

以下是完整的查询

SELECT * FROM [tempimporttblTrainingLog]
LEFT JOIN tblIndividual I ON [Instructor] = I.FirstName + ' ' + I.Surname
WHERE (I.FirstName + ' ' + I.Surname IS NULL) AND (Instructor IS NOT NULL OR Instructor <> '')

SELECT * FROM [tempimporttblTrainingLog]
LEFT JOIN tblIndividual I ON [Instructor] = I.FirstName + ' ' + I.Surname
WHERE (I.FirstName + ' ' + I.Surname IS NULL) AND (ISNULL(Instructor, '') <> '')

【问题讨论】:

    标签: tsql where-clause


    【解决方案1】:
    ISNULL(Instructor, '') <> ''    (1)
    

    等价于

    (Instructor IS NOT NULL AND Instructor <> '')   (2)
    

    不是

    (Instructor IS NOT NULL OR Instructor <> '')   (3)
    

    如果 Instructor 为 NULL,则 (1) 和 (2) 将返回 FALSE,而 (3) 则返回 TRUE。 当 Instructor = '' 时也是如此。

    【讨论】:

    • NOT (Instructor IS NULL OR Instructor = '') 如果你真的很喜欢使用OR...
    【解决方案2】:
    ISNULL(Instructor, '') <> '' 
    

    不会返回空白记录,并且您在 (Instructor IS NOT NULL OR Instructor &lt;&gt; '') 行,这意味着它会返回任何非空值和非空白值,你是不是要放一个AND 来代替?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2012-06-28
      相关资源
      最近更新 更多