Postgresql NOT NULL AND <> ''与NOT NULL OR <> ''的区别

4
我已经阅读了很多关于NOT NULL和<>''之间的区别的内容,最好的解释在以下链接中找到:https://www.postgresql.org/message-id/AANLkTilEsUTIeUkZCX9Vc14kciFiuvFBRRE-yen4K_Zi@mail.gmail.com,其中指出:
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语句相关联而不是AND语句?我不想要既是NULL又是空字符串的邮政编码,只需要其中一个。

如果这是一个愚蠢的问题,请原谅,使用AND对我来说似乎不合逻辑,我不想盲目地做某事而不了解结果背后的过程。我曾经认为自己完全理解NOT NULL和<>''之间的区别,但像大多数Postgres相关的事情一样,我深入研究它越发现我实际上并不知道!


除非“arg”为“null”或“val1 = val2”,否则“arg!= val1或arg!= val2”始终为真。如果“postcode”不为null,则可以忽略“or”运算符的第二个表达式。因此,您猜测使用“and”是正确的。或者“not(postcode is null or postcode ='')”。另一种方法:nullif(postcode,'')不为nullcoalesce(postcode,'')<>''但这需要调整索引。 - Abelisto
4个回答

9
你会受益于了解德摩根定律,它是布尔逻辑的基础。
在这种情况下,你的条件不是你所表达的:
(NOT NULL) OR (NOT EMPTY)

但实际上是:
NOT (NULL OR EMPTY)

根据德摩根定律展开后实际上变成:
(NOT NULL) AND (NOT EMPTY)

因此,AND 是正确(而且确实是“逻辑上”的)运算符。

谢谢Alnitak,你的解释真的让我清楚了。还要感谢其他所有人,现在我想我已经理解了! - mmTmmR

2

当您使用 or 连接两个表达式时,只有其中一个表达式为 true 时,结果将为 true:

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

在您的情况下,只要 postcode 不为空,结果就会是 true。一个空的 postcode 也不是 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

2
SELECT postcode FROM customer_table_1 WHERE postcode IS NOT NULL AND postcode != ''

最初的回答似乎可以解决问题。
这段代码看起来能够完成任务。

0
以简单易懂的语言来说,您正在寻找符合两个条件的记录:(postcode IS NOT NULL)并且(postcode <> '')
仅满足(postcode IS NOT NULL) 或者 (postcode <> '')是不够的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接