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
另一方面,以下使用 NOT 和 equality 的查询给出了预期的结果
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 不可为空。
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'
- 没有任何行满足。
也许这看起来很基本,但我无法解释 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 |
---|---|---|
另一方面,以下使用 NOT 和 equality 的查询给出了预期的结果
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 不可为空。
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'
- 没有任何行满足。