为什么两个看似相同的where子句涉及null会产生不同的结果

时间:2015-07-16 10:57:52

标签: tsql where-clause

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

所以这种特殊情况我希望得到所有教练'来自个人表中尚未包含的导入表。显然,我不想要任何空白的教练。我尝试在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, '') <> '')

2 个答案:

答案 0 :(得分:1)

ISNULL(Instructor, '') <> ''    (1)

相当于

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

不是

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

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

答案 1 :(得分:0)

ISNULL(Instructor, '') <> '' 

不会返回空白记录,并且您有一个OR (Instructor IS NOT NULL OR Instructor <> '') line,意思是它会返回任何非null和非空格的东西,你的意思是改为放置AND吗?