为什么两个看似相同的包含 null 的 where 子句会产生不同的结果
Why do two seemingly identical where clauses involving nulls produce different results
我正在尝试 select 所有在特定列中没有空值且其值不在另一个 table 中的记录。
所以在这种特殊情况下,我想从导入 table 中获取所有 'Instructors',这些 table 还不在个人 table 中。显然我不想要任何空白的讲师。我第一次尝试在 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, '') <> '')
ISNULL(Instructor, '') <> ''
不会 return 空白记录,并且您在
(Instructor IS NOT NULL OR Instructor <> '')
行,这意味着它会 return 任何不为空和非空白的东西,你是想放一个 AND
吗?
ISNULL(Instructor, '') <> '' (1)
等同于
(Instructor IS NOT NULL AND Instructor <> '') (2)
不是
(Instructor IS NOT NULL OR Instructor <> '') (3)
如果 Instructor 为 NULL,则 (1) 和 (2) 将 return FALSE,当 (3) return 为 TRUE 时。
当 Instructor = ''.
时相同
我正在尝试 select 所有在特定列中没有空值且其值不在另一个 table 中的记录。
所以在这种特殊情况下,我想从导入 table 中获取所有 'Instructors',这些 table 还不在个人 table 中。显然我不想要任何空白的讲师。我第一次尝试在 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, '') <> '')
ISNULL(Instructor, '') <> ''
不会 return 空白记录,并且您在
(Instructor IS NOT NULL OR Instructor <> '')
行,这意味着它会 return 任何不为空和非空白的东西,你是想放一个 AND
吗?
ISNULL(Instructor, '') <> '' (1)
等同于
(Instructor IS NOT NULL AND Instructor <> '') (2)
不是
(Instructor IS NOT NULL OR Instructor <> '') (3)
如果 Instructor 为 NULL,则 (1) 和 (2) 将 return FALSE,当 (3) return 为 TRUE 时。 当 Instructor = ''.
时相同