PostgreSQL WHERE 子句什么是included/excluded?

PostgreSQL WHERE Clause what is included/excluded?

我遇到过一个包含很多这样的 WHERE 语句的 postgresql 查询

WHERE (category <> 'A' OR category IS NULL)
AND (category <> 'B' OR category IS NULL) 

我很难理解这个查询是什么数据including/excluding。

我尝试将上面的代码重写为

  1. WHERE category NOT IN ('A','B')

  2. WHERE category NOT IN ('A', 'B') OR category IS NULL

  3. WHERE (category NOT IN ('A', 'B') OR category IS NULL)

而且三个人都对原码给出了不同的答案。

谁能给我解释一下以上四种情况下included/excluded中的数据是什么?

比如说数据看起来像

ID Category
1 A
2 B
3 C
4 D
5 NULL

对于 (1),我只会得到 ID 的 3、4。但我不确定其他的。

编辑:WHERE (category NOT IN ('A', 'B') OR category IS NULL)

WHERE (category <> 'A' OR category IS NULL)
AND (category <> 'B' OR category IS NULL)

给出相同的答案。

但是没有括号的WHERE category NOT IN ('A', 'B') OR category IS NULL给出了不同的答案。

我觉得你在查询逻辑上很费劲,第一个很好理解

where category not in ('A','B') 

你会得到 id : 3,4,5

请注意,使用类别的 ID 比使用字母更好。

在第二个查询中

where category not in ('A','B') or category is null

条件都为真并且都完成

你会得到 ids: 3,4

第三个它必须为您提供与 (2) 条件相同的输出

要正确理解上述查询的输出,您必须按以下方式思考:逐条获取满足 WHERE 子句的所有行。

查询 1

  1. WHERE category NOT IN ('A','B')

查询 1 应给出不在指定集合中的所有具有属性 category 的行。 如果您一步一步进行,一次一行,您可以看到:

  • 前两行未包含在输出中,因为 category 列包含集合 ('A','B')
  • 中的值
  • 接下来的两行包含在输出中,因为 category 列不包含集合 ('A','B')
  • 中的值
  • 最后一行未包含在输出中,因为根据 Three-Valued Logic
  • NULL 值被评估为 UNKNOWN

为了更好地理解最后一点,子句 WHERE category NOT IN ('A','B') 可以重写为 WHERE category<>'A' AND category<>'B'。由于 category 为 NULL,逻辑表达式按以下方式求值 WHERE NULL<>'A' AND NULL<>'B',输出为 UNKNOWN,因此该行将不包含在输出结果中。

查询 2 和 3

  1. WHERE category NOT IN ('A', 'B') OR category IS NULL

查询 2 和 3 相同,因为在这种情况下括号不影响逻辑运算符的计算顺序。

在这种特殊情况下,上面示例 table 的最后一行包含在输出中,因为 category NOT IN ('A','B') 被评估为 UNKNOWN,而 category IS NULL 被评估为 TRUE。出于与上述相同的原因 (Three-Valued Logic),UNKNOWN or TRUE 的结果为 TRUE。