WHERE 子句和使用 AND 逻辑运算符的分组不等式

WHERE clause and grouped inequality using AND logical operator

也许这看起来很基本,但我无法解释 Snowflake 中的以下行为。

我得到以下 table 包含 2 行。

CREATE OR REPLACE TABLE foo (id integer, field1 string, field2 string);
INSERT INTO foo VALUES
  (23493132, 'Stop', 'Unexpected Downtime'),
  (23493132, 'Stop', 'Break')
;

哪个给我以下table内容

ID FIELD1 FIELD2
23493132 Stop Unexpected Downtime
23493132 Stop Break

我想要 select 获得 ID 23493132 并且字段 1 Stop 与字段 2 没有关联的行中断

我期待单行结果,第一个。

所以我写了下面的查询

SELECT 
    * 
FROM foo
WHERE (id = 23493132)
    AND (field1 != 'Stop' AND field2 != 'Break')
;

没有返回

ID FIELD1 FIELD2

另一方面,以下使用 NOTequality 的查询给出了预期的结果

SELECT
*
FROM foo
WHERE id = 23493132
    AND NOT (field1 = 'Stop' AND field2 = 'Break')
;
ID FIELD1 FIELD2
23493132 Stop Unexpected Downtime

有人可以向我解释一下我的第一个查询有什么问题吗,因为我有点困惑...

On the other hand the following query using NOT and equality is giving me the expected result

AND NOT (field1 = 'Stop' AND field2 = 'Break')

等价查询(*):

SELECT    * 
FROM foo
WHERE (id = 23493132)
    AND (field1 != 'Stop' OR field2 != 'Break');

(*) 假设 field1/field2 不可为空。


De Morgan's Law:

the negation of a conjunction is the disjunction of the negations

NOT (A AND B) <=> (NOT A) OR (NOT B)

只是为了扩展@lukasz 所说的内容:

您似乎想要做的是与以下子句相反:

(field1 = 'Stop' AND field2 != 'Break')

子句 (A and B) 的反义词实际上是 (!A or !B)

这是因为 and 将事物向下缩小,而 or 将事物向外扩展。所以你想要的是:

(field1 != 'Stop' OR field2 != 'Break')

第一个查询有三个条件用 AND 连接(此处括号无关紧要)。

所以它正在寻找满足所有三个条件的行。

包括 field1 != 'Stop' - 没有任何行满足。