SQL - 逐步过滤

SQL - filtering on a step by step basis

我最近遇到了这个问题。我试图删除列名上带有特定字符的行。我通过创建几个临时 table 来做到这一点,如下所示:

CREATE TEMPORARY TABLE tri1 as
SELECT * FROM loading WHERE postcode != 'n/a';

CREATE TEMPORARY TABLE tri2 as
SELECT * FROM tri1 WHERE postcode != '--';

CREATE TEMPORARY TABLE tri3 as
SELECT * FROM tri2 WHERE postcode != 'n-a';

CREATE TEMPORARY TABLE tri4 as
SELECT * FROM tri3 WHERE postcode != '99999';

这个冗长的解决方案效果很好。

但是我的第一次尝试是使用这个 SQL 查询:

CREATE TEMPORARY TABLE tri1 AS
SELECT * FROM loading WHERE (postcode != 'n/a' OR postcode != '--' OR postcode != 'n-a' OR postcode != '99999');

问题是我返回的行数比我像上面那样进行顺序级联临时 table 排序时返回的行数少。

为什么?

谢谢。

使用这么多临时表不是解决问题的方法。您只使用一个查询是正确的,但您的逻辑是错误的。这是更正后的查询:

CREATE TEMPORARY TABLE tri1 AS
SELECT * FROM loading
WHERE (postcode != 'n/a' AND postcode != '--' AND postcode != 'n-a' AND postcode != '99999');

Issue is that I get less returned rows than when I'm doing a sequential cascade temporary table

你让记录从裂缝中溜走。按照你的逻辑,一条记录要满足所有的条件才会被拒绝。例如,没有 '--' 的记录将通过,即使它有 '99999'。

管理我上面给出的查询的逻辑规则称为 De Morgan 定律,您可以 read about it here.