2016-09-17 54 views
0

我想我並不完全理解SQL中NULL的含義。我跑了這個SQL,我期望看到1作爲輸出,但我沒有看到:「select 1 where NULL <> -1」的輸出;「

select 1 where NULL <> -1; 

是不是NULL和-1不同?任何人都可以解釋爲什麼「NULL <> -1」這個子句是否爲假?

+2

基本上,除IS NULL以外的所有比較都返回「false」或「NULL」。也就是說,它們從來都不是真的,行被過濾掉了。 –

+1

NULL不是一個值,因此無法進行比較。 – Joe

+1

這就是爲什麼我們聲明'something IS NULL'而不是'something = NULL' –

回答

0

NULL不是一個值,因此不能與任何其他值進行比較並獲得除null之外的其他結果。 Docs。和how來比較空值。

+0

我不知道OP使用的是什麼RDBMS,但我不認爲它是Oracle。 Oracle不應該接受OP的語法IIRC,它需要'from'。 – hvd

+0

@hvd:關於如何處理表達式中的NULL值的解釋仍然適用於任何SQL方言 –

+0

@a_horse_with_no_name通常是的,但鏈接文檔也包含Oracle特定的詳細信息,至少有關零長度字符串的警告和提到一些非標準功能。這對OP沒有用處。 – hvd

0

NULL意味着未知。所以用where NULL <> -1你想知道未知值是否等於-1。 DBMS不知道(當然),所以表達式的結果既不是TRUE也不是FALSE;它是NULL

僅選擇WHERE子句導致TRUE的行。由於您的表達式不會導致TRUE,而是導致NULL,因此不會選擇任何行。

+0

事實上,與NULL比較的結果會導致UNKNOWN,而不是NULL。 – dnoeth

+0

@dnoeth:不,NULL *是未知的數據庫名稱。嘗試'select 1 where(null = -1)is null'。 (這裏是對PostgreSQL的測試:http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/11585。) –

+0

列可以是NULL,但從來沒有比較的結果,這就是爲什麼有'IS UNKNOWN'標準SQL(也是PostgreSQL)。請參閱https://books.google.de/books?id=efe2wB_DfxYC&pg=PA219&lpg=PA219&dq=%22Truth+table+for+the+AND+boolean+operator%22&source=bl&ots=DfT9W4xLGF&sig=Yee-tSw5oQjTfoazWtRYEzuXBMM&hl=de&sa = X&ved = 0ahUKEwjQ6ICmrpfPAhWBpiwKHVNQBo0Q6AEIJTAB#v = onepage&q =%22Truth%20table%20for%20the%20AND%20boolean%20operator%22&f = false – dnoeth

相關問題