2017-05-27 194 views
1

使用NULL。因此,像SELECT c FROM t WHERE c > 0將其中c既沒有NULL和大於零(因爲當cNULL條件c > 0評估爲NULL)從t選擇所有的行。在WHERE子句

我不確定是否我可以依靠這種行爲,因爲WHERE NULL看起來像一個黑客。 (可能更正確的方法是使用CASE表達式。)

+0

您是否試過'SELECT c FROM t WHERE c is null'? –

+0

@YuvalPruss我需要'C'既不是'NULL',並且大於零。 –

+0

所以:'SELECT c FROM t WHERE c is null or c> 0 –

回答

2

這不是Postgres特定的行爲。它是如何定義SQL以及SQL如何定義值的。

條件:

WHERE c > 0 

肯定條件。它將c > 0評估的所有行保留爲true。

cNULL時,則c > 0評估爲NULLNULL不正確(也不是false),因此c > 0會過濾掉NULL值。幾乎所有的比較NULL返回NULL

另外:

WHERE NOT (c > 0) 

也過濾掉NULL值,因爲NOT NULL是一樣的NULL

如果你想保持NULL值,我建議是明確的:

WHERE c > 0 OR c IS NULL 
+0

啊我看到了,所以當做布爾運算'NULL'基本上是一個未知的,使一些結果也未知。但是,無論其他謂詞如何評估,「真實或......」和「假和......」總是有確定性的結果。 –

+0

而且,'SELECT'只保留'TRUE'行,並且拋棄'FALSE'和未知行......對吧? –

+1

@ZizhengTai是的,沒錯。 – melpomene

1

根據我的the documentation解釋,你可以依靠的事實,只有非空的元素將被退回:

當任一輸入爲空時,普通比較運算符產生null(表示「未知」),不是真或假。例如,7 = NULL會產生null,7 <> NULL。當發生這種情況是不適合的,使用IS [NOT] DISTINCT FROM謂詞:

a IS DISTINCT FROM b 
a IS NOT DISTINCT FROM b 

對於非空輸入,有別於相同的<>運算符。但是,如果兩個輸入都爲空,則返回false,並且如果只有一個輸入爲空,則返回true。同樣,對於非空輸入,IS NOT DISTINCT FROM與=相同,但當兩個輸入都爲空時它將返回true,而當只有一個輸入爲空時,則返回false。因此,這些謂詞有效地表現爲空值是正常的數據值,而不是「未知」。

要檢查值是否爲或不爲空,則使用謂詞:

expression IS NULL 
expression IS NOT NULL 

或相當,但非標準,謂詞:

expression ISNULL 
expression NOTNULL 

不要寫expression = NULL,因爲NULL不等於NULL。 (空值表示未知值,並且不知道兩個未知值是否相等。)