我讀過很多關於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相關的大多數事情一樣,我越深入研究它,越是意識到我實際上並不知道!
'arg!= val1或arg!= val2'總是如此,除非'arg'爲'null'或者'val1 = val2'如果postcode不爲null,那麼'or'運算符的第二個表達式可以忽略。所以你猜測使用'和'是對的。或者'不(郵編爲空或郵編='')'。還有另一種方法:'nullif(postcode,'')不是null'或'coalesce(postcode,'')<>'''但是這需要調整索引。 – Abelisto