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

时间:2016-08-08 12:16:59

标签: postgresql null logical-operators comparison-operators

我已经阅读了很多关于NOT NULL vs<>''

之间的区别

我找到的最佳解释是:

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和&lt;&gt;&#39;&#39;之间的区别。但正如Postgres所关注的大多数事情一样,我越深入研究它,我就越意识到我实际上并不知道!

3 个答案:

答案 0 :(得分:2)

or两个表达式时,如果其中至少有一个是true,则结果为true

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

postcode is not null时,结果为true。一个空的postcode is 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

答案 1 :(得分:0)

您将从了解布尔逻辑基础的De Morgan's Law中受益。

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

(NOT NULL) OR (NOT EMPTY)

但实际上是:

NOT (NULL OR EMPTY)
根据De Morgan扩展的实际上变成了:

(NOT NULL) AND (NOT EMPTY)

因此AND为什么是正确的(实际上是&#34;逻辑&#34;)运算符。

答案 2 :(得分:0)

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

这似乎可以解决问题