這顯然不打算返回一行...在SQL Server中,爲什麼NULL不等於空字符串AND不等於空字符串?
select 1 where null = ''
但爲什麼這個也不返回一行?
select 1 where null <> ''
這兩個問題怎麼可能是「假」?
這顯然不打算返回一行...在SQL Server中,爲什麼NULL不等於空字符串AND不等於空字符串?
select 1 where null = ''
但爲什麼這個也不返回一行?
select 1 where null <> ''
這兩個問題怎麼可能是「假」?
「怎麼能這兩個哪來的是 」假「?」
這不是! 答案也不是「真」! 答案是「我們不知道」。
把NULL
想象成你還不知道的值。
你敢打賭它是''
?
你敢打賭這不是''
?
因此,更安全的是宣佈你還不知道。因此,這兩個問題的答案都不是錯誤的,但我不知道,例如。 SQL中的NULL
。
當比較 - wikipedia article explains it quite well時,空有一些非常奇怪的行爲。簡而言之,以及真實和錯誤,都有一個未知的值,SQL在比較時返回。
因爲與NULL任何比較返回false(或者更準確地說:返回NULL)
爲空是沒有的,你不能告訴是否等於或不等於什麼信息。
SQL標準規定NULL = x
是假的所有x
(即使x
本身NULL
)和SQL Server只是遵循標準。如果你想檢查是否有或不是NULL
,那麼你必須使用x IS NULL
或x IS NOT NULL
。
可能變得有點重複這裏,但我的兩分錢反正:
A. a_horse_with_no_name的例子(註釋,上面)是一個非常好的一個!
B.在非=數學術語中,NULL是未知值。一個空字符串是一個長度爲零的字符串 - 因此是一個「已知」值。這就是爲什麼NULL不會與空字符串相同或不相等。
C.由於NULL表示未知,所以不可能比較兩個NULL值是否相等。如果你不知道X的價值,並且你不知道Y的價值,那麼你不知道它們是否平等。
因爲這是SQL Server的符合ANSI SQL ;-)
NULL
在SQL實例有點類似於IEEE楠比較規則:NaN != NaN
和NaN == NaN
都是假的。它需要SQL中的特殊運算符IS NULL
(或IEEE FP的"IsNaN"
)來檢測這些特殊值。(其實有多種方法來檢測這些特殊值:IS NULL/"IsNaN"
只是乾淨和簡單的方法。)
然而,NULL = x
更進了一步:的NULL =/<> x
結果是不假。相反,表達式的結果是本身 UNKNOWN。因此,NULL
NOT(NULL = '')
是也 UNKNOWN(或在「上下文中的」false「 - 請參閱評論)。歡迎SQL tri-state logic ;-)NULL
的世界因爲問題是有關SQL Server,然後完整性:如果運行與"SET ANSI_NULLS OFF"運行 - 但看到上面的言論/警告 - 那麼「原始」 TSQL行爲達到。
「原始」 的行爲(這是過時):
SET ANSI_NULLS OFF;
select 'eq' where null = ''; -- no output
select 'ne' where null <> ''; -- output: ne
select 'not' where not(null = ''); -- output: not; null = '' -> False, not(False) -> True
ANSI-NULL的行爲(默認在最近的東西,請使用):
SET ANSI_NULLS ON;
select 'eq' where null = ''; -- no output
select 'ne' where null <> ''; -- no output
select 'not' where not(null = ''); -- no output; null = '' -> Unknown, not(Unknown) -> Unknown
編碼愉快。
好點,謝謝 – JeremyWeir 2011-03-28 21:37:57
'NULL = x'的計算結果爲UNKNOWN。在'WHERE'上下文中,結果是行被從結果集中移除。在約束上下文中,效果是對行的更新不會失敗。 – onedaywhen 2011-03-29 07:51:54
@onedaywhen感謝您的更正。我已經適當地更新了答案。 – 2011-03-29 19:54:59
數據庫具有所謂的三值邏輯。真值,假值和未知值。
閱讀本http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/
我覺得很奇怪,我認爲(沒有信息)=(信息) – JeremyWeir 2011-03-28 21:29:50
@jayrdub:認爲它是這樣的:如果你沒有自己的飛船,如何能你知道太空船有哪種顏色?它既不是白色也不是白色。 – 2011-03-28 21:31:01
但我擁有一艘太空船。謝謝,這有幫助。 – JeremyWeir 2011-03-28 21:32:13