3

我明白为什么这两个陈述是错误的

NULL LIKE 'X'
NULL NOT LIKE 'X'

但是,我不明白为什么这些是:

NOT (NULL LIKE 'X')
NOT (NULL NOT LIKE 'X')

例如,我认为这两个语句应该返回不同的值:

SELECT CASE WHEN NOT (NULL LIKE 'X') THEN 'True' ELSE 'False' END
SELECT CASE WHEN     (NULL LIKE 'X') THEN 'True' ELSE 'False' END
4

3 回答 3

7

SQL 使用三值逻辑。你说这些都是假的:

NULL LIKE 'X'
NULL NOT LIKE 'X'
NOT (NULL LIKE 'X')
NOT (NULL NOT LIKE 'X')

但事实并非如此。它们都是空的,既不是真的也不是假的。

WHENor子句拒绝非真值WHERE,这意味着空值和假值,所以看起来 null 与假相同,但正如您所注意到的,事实并非如此。:-)

于 2012-08-23T19:47:23.127 回答
2

NULL总是NULL你无法将它与类似的东西进行比较。您正在寻找的答案不能是真或假。

就像您无法比较一样,这将始终返回零行,因为NULL它是一个未知值。

SELECT *
FROM yourTable 
WHERE yourCol = NULL
于 2012-08-23T19:48:27.707 回答
2

NULL 始终未定义。

所以价值

not (NULL like X) is undefined

并且

not (NULL not like X) is undefined

Undefined 的最佳近似值是 NULL,因此两个语句都评估为 NULL(不是,你明白,等于 NULL,我们不知道它们等于什么)

于 2012-08-23T19:49:22.533 回答