2016-08-08 81 views
0

我讀過很多關於NOT NULL VS <>'之間的差異PostgreSQL的NOT NULL和<> '' VS NOT NULL或<>'

我發現這是最好的解釋:

https://www.postgresql.org/message-id/[email protected]其中規定:

NULL表示這個問題尚未回答,因而不存在 答案,可能會有一個答案,一旦它被設置成你不能真正 說答案是空的。空將意味着答案已經給出,並且 答案是空的。

對於表我的工作,我試圖篩選有效郵政編碼只(郵政編碼是在這個特定表中VARCHAR)的結果,我試過如下:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> ''; 

但是,這在我的結果中給出了一些空白的郵政編碼。打破這種下來...

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL; 

給出了一些空白郵政編碼而

SELECT postcode FROM customer_table_1 
WHERE postcode <>''; 

只給出了結果的有效郵政編碼。因此查詢的IS NOT NULL部分沒有按照我的想法做。

作爲更復雜的查詢的一部分,我以前使用:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL AND postcode <> ''; 

並取得了理想的結果。但是我一直認爲應該把它

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> ''; 

因爲我要尋找的是有一個有效的郵政編碼的所有記錄(即不爲null或不爲空字符串)應該將這些不能用OR語句連接,而不是和?我不在尋找既是NULL又是空字符串的郵編,只是一個或另一個。

道歉,如果這是一個愚蠢的問題,使用AND對我來說似乎不合邏輯,而且我不想在不理解結果背後的過程的情況下盲目地做某件事。我以爲我完全理解了NOT NULL和<>之間的區別,但與Postgres相關的大多數事情一樣,我越深入研究它,越是意識到我實際上並不知道!

+0

'arg!= val1或arg!= val2'總是如此,除非'arg'爲'null'或者'val1 = val2'如果postcode不爲null,那麼'or'運算符的第二個表達式可以忽略。所以你猜測使用'和'是對的。或者'不(郵編爲空或郵編='')'。還有另一種方法:'nullif(postcode,'')不是null'或'coalesce(postcode,'')<>'''但是這需要調整索引。 – Abelisto

回答

0

你會從知道De Morgan's Law這是布爾邏輯根本利益。

在這種情況下,你的病情是不是你表達什麼爲:

(NOT NULL) OR (NOT EMPTY) 

但實際上是:

NOT (NULL OR EMPTY) 

根據德摩根卻成爲其擴張到:

(NOT NULL) AND (NOT EMPTY) 

因此爲什麼AND是正確的(實際上是「邏輯」)運算符。

+0

謝謝Alnitak,這真的爲我清除了。感謝所有其他人,我想我現在已經開始理解它了! – mmTmmR

2

當你or兩個表達式的結果將是true時,其中至少有一個是true

select true or false; 
?column? 
---------- 
t 

在你的情況,每當postcodeis not null結果將是true。空postcodeis not null所以它會被退回:

select 
    '' is not null, -- empty is not null 
    '' <> '',  -- false 
    '' is not null or '' <> '' -- (true or false) is true 
; 
?column? | ?column? | ?column? 
----------+----------+---------- 
t  | f  | t 
相關問題