我已经阅读了很多关于NOT NULL和<>''之间的区别的内容,最好的解释在以下链接中找到:https://www.postgresql.org/message-id/AANLkTilEsUTIeUkZCX9Vc14kciFiuvFBRRE-yen4K_Zi@mail.gmail.com,其中指出:
NULL表示问题尚未得到回答,因此没有答案,一旦提供了答案,就可能会有答案,因此您无法说答案为空。空的意思是答案已经给出,而答案是空的。
对于我正在处理的表格,我尝试过滤出只有有效邮政编码的结果(邮政编码在这个特定的表格中是一个VARCHAR),我尝试了以下方法:
然而,这在我的结果中产生了一些空邮政编码。将其分解...
因为我正在寻找所有具有有效邮政编码的记录(即不为NULL或不为空字符串),所以这些记录应该与OR语句相关联而不是AND语句?我不想要既是NULL又是空字符串的邮政编码,只需要其中一个。
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相关的事情一样,我深入研究它越发现我实际上并不知道!
nullif(postcode,'')不为null
或coalesce(postcode,'')<>''
但这需要调整索引。 - Abelisto