使用NULL。因此,像SELECT c FROM t WHERE c > 0
將其中c
是既沒有NULL
和大於零(因爲當c
是NULL
條件c > 0
評估爲NULL
)從t
選擇所有的行。在WHERE子句
我不確定是否我可以依靠這種行爲,因爲WHERE NULL
看起來像一個黑客。 (可能更正確的方法是使用CASE
表達式。)
使用NULL。因此,像SELECT c FROM t WHERE c > 0
將其中c
是既沒有NULL
和大於零(因爲當c
是NULL
條件c > 0
評估爲NULL
)從t
選擇所有的行。在WHERE子句
我不確定是否我可以依靠這種行爲,因爲WHERE NULL
看起來像一個黑客。 (可能更正確的方法是使用CASE
表達式。)
這不是Postgres特定的行爲。它是如何定義SQL以及SQL如何定義值的。
條件:
WHERE c > 0
是肯定條件。它將c > 0
評估的所有行保留爲true。
當c
是NULL
時,則c > 0
評估爲NULL
。 NULL
不正確(也不是false),因此c > 0
會過濾掉NULL
值。幾乎所有的比較NULL
返回NULL
。
另外:
WHERE NOT (c > 0)
也過濾掉NULL
值,因爲NOT NULL
是一樣的NULL
。
如果你想保持NULL
值,我建議是明確的:
WHERE c > 0 OR c IS NULL
啊我看到了,所以當做布爾運算'NULL'基本上是一個未知的,使一些結果也未知。但是,無論其他謂詞如何評估,「真實或......」和「假和......」總是有確定性的結果。 –
而且,'SELECT'只保留'TRUE'行,並且拋棄'FALSE'和未知行......對吧? –
@ZizhengTai是的,沒錯。 – melpomene
根據我的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。 (空值表示未知值,並且不知道兩個未知值是否相等。)
您是否試過'SELECT c FROM t WHERE c is null'? –
@YuvalPruss我需要'C'既不是'NULL',並且大於零。 –
所以:'SELECT c FROM t WHERE c is null or c> 0 –