Postgresql NOT NULL AND <> '' vs NOT NULL OR <> ''

mmT*_*mmR 0 postgresql null logical-operators comparison-operators

我已经阅读了很多关于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 <> '';
Run Code Online (Sandbox Code Playgroud)

但是,这在我的结果中给出了一些空白邮政编码。打破这个...

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

给出一些空白邮政编码,而

SELECT postcode FROM customer_table_1 
WHERE postcode <>'';
Run Code Online (Sandbox Code Playgroud)

只在结果中给出有效的邮政编码。因此,查询的 IS NOT NULL 部分没有做我认为的那样。

作为更复杂查询的一部分,我以前使用过:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL AND postcode <> '';
Run Code Online (Sandbox Code Playgroud)

并达到了预期的效果。不过我一直觉得应该是

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> '';
Run Code Online (Sandbox Code Playgroud)

因为我正在寻找所有具有有效邮政编码(即不是 NULL 或非空字符串)的记录,这些记录不应该与 OR 语句而不是 AND 连接吗?我不是在寻找既是 NULL 又是空字符串的邮政编码,只是其中之一。

抱歉,如果这是一个愚蠢的问题,使用 AND 对我来说似乎不合逻辑,而且我不想在不了解结果背后的过程的情况下盲目地做某事。我以为我完全理解 NOT NULL 和 <>'' 之间的区别,但是与 Postgres 相关的大多数事情一样,我越深入研究它就越意识到我实际上并不知道!

Aln*_*tak 7

您将从了解德摩根定律中受益,该定律是布尔逻辑的基础。

在这种情况下,您的情况不是您所表达的:

(NOT NULL) OR (NOT EMPTY)
Run Code Online (Sandbox Code Playgroud)

但实际上是:

NOT (NULL OR EMPTY)
Run Code Online (Sandbox Code Playgroud)

根据 De Morgan 的扩展实际上变成了:

(NOT NULL) AND (NOT EMPTY)
Run Code Online (Sandbox Code Playgroud)

因此为什么AND是正确的(实际上是“逻辑的”)运算符。