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。
我尝试将上面的代码重写为
WHERE category NOT IN ('A','B')
WHERE category NOT IN ('A', 'B') OR category IS NULL
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
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
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。
我遇到过一个包含很多这样的 WHERE 语句的 postgresql 查询
WHERE (category <> 'A' OR category IS NULL)
AND (category <> 'B' OR category IS NULL)
我很难理解这个查询是什么数据including/excluding。
我尝试将上面的代码重写为
WHERE category NOT IN ('A','B')
WHERE category NOT IN ('A', 'B') OR category IS NULL
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
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
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。