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 相关的大多数事情一样,我越深入研究它就越意识到我实际上并不知道!
在这种情况下,您的情况不是您所表达的:
(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
是正确的(实际上是“逻辑的”)运算符。
归档时间: |
|
查看次数: |
9322 次 |
最近记录: |