在我的where子句中, 我有以下内容:
where SharePt NOT LIKE 'SharePoint Document%'
即使SharePt为空,结果也不会返回任何内容。
但是,当我执行以下操作时,它会起作用 或SharePtVer IS NULL
where SharePt NOT LIKE 'SharePoint Document%' OR SharePt IS NULL
想知道为什么NOT LIKE在包含NULL>
方面不起作用答案 0 :(得分:6)
SQL使用three-valued logic ... NULL
与FALSE
不同,NOT NULL
与TRUE
不同。
NULL
表示缺少值,并在SQL的三值逻辑中起到未知值的作用:
A AND B | TRUE | FALSE | Unknown
--------+---------+---------+--------
TRUE | TRUE | FALSE | Unknown
FALSE | FALSE | FALSE | FALSE
Unknown | Unknown | FALSE | Unknown
A OR B | True | False | Unknown
--------+---------+---------+--------
True | True | True | True
False | True | False | Unknown
Unknown | True | Unknown | Unknown
评估where SharePt NOT LIKE 'SharePoint Document%'
时,SharePt
是NULL
还是未知......那么结果将是未知的...... SharePt
可能是也可能不是{ {1}}。
答案 1 :(得分:3)
迈克尔弗雷德里克森答案中的完整真值表应如下:
A | B | A AND B
---------+---------+--------
TRUE | TRUE | TRUE
TRUE | UNKNOWN | UNKNOWN
TRUE | FALSE | FALSE
FALSE | TRUE | FALSE
FALSE | UNKNOWN | FALSE
FALSE | FALSE | FALSE
UNKNOWN | TRUE | UNKNOWN
UNKNOWN | UNKNOWN | UNKNOWN
UNKNOWN | FALSE | FALSE
A | B | A OR B
---------+---------+-------
TRUE | TRUE | TRUE
TRUE | UNKNOWN | TRUE
TRUE | FALSE | TRUE
FALSE | TRUE | TRUE
FALSE | UNKNOWN | UNKNOWN
FALSE | FALSE | FALSE
UNKNOWN | TRUE | TRUE
UNKNOWN | UNKNOWN | UNKNOWN
UNKNOWN | FALSE | UNKNOWN
OP的谓词:
( SharePt NOT LIKE 'SharePoint Document%' ) OR ( SharePt IS NULL )
将NULL
用于变量SharePt
:
( NULL NOT LIKE 'SharePoint Document%' ) -- evaluates UNKNOWN
( NULL IS NULL ) -- evaluates to TRUE
从真相表中:
( UNKNOWN ) OR ( TRUE ) -- evaluates TRUE
答案 2 :(得分:0)
因为除非您特别测试IS NULL或IS NOT NULL,否则与ANYTHING相比,NULL为NULL / FALSE。
令人惊讶的是,NULL = NULL也是FALSE