SQL - 逐步过滤

时间:2015-03-19 08:57:32

标签: sql postgresql-9.1

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

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');

问题是我返回的行数少于我上面执行顺序级联临时表排序时的行数。

为什么?

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

问题是我获得的返回行数少于我执行顺序级联临时表时的行数

你让记录从裂缝中滑落。根据您的逻辑,记录必须具有所有条件才能被拒绝。例如,没有' - '的记录会通过,即使它有'99999'。

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