我已经阅读了很多关于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所关注的大多数事情一样,我越深入研究它,我就越意识到我实际上并不知道!
答案 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 != ''
这似乎可以解决问题