2012-08-23 30 views
3

我明白了为什么这两个声明均属不实为什么“Null Like X”和“Not(Null Like X)”相等?

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 

回答

7

SQL使用three-valued logic。你说这些都是假的:

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

但这实际上并非如此。它们全都为空,即既不是也不是也不是错误。

A WHENWHERE子句拒绝非真值,这意味着空值和假值,所以它看起来像null和false一样,但正如你注意到的那样,事实并非如此。 :-)

+0

谢谢,我很容易理解你的帖子。我认为'NULL LIKE [无论]]是错误的,而不是空的。没想到'LIKE'可以返回NULL' – Tipx

+0

@Tipx:不客气!是的,三值逻辑是SQL中更令人困惑和有争议的方面之一。 – ruakh

2

NULL永远是NULL你不能把它比作这样的事情。它不可能是真实的或错误的,这是你正在寻找的答案。

它就像你无法比较,这总是会返回零行,因为NULL是未知值。

SELECT * 
FROM yourTable 
WHERE yourCol = NULL 
2

NULL始终未定义。

所以

not (NULL like X) is undefined 

not (NULL not like X) is undefined 

未定义的最好的近似值为NULL所以这两个语句计算为NULL(没有,你明白了,等于NULL,我们不知道他们等于什么)