我有以下 WHERE
子句:
NOT(部门 = '免费增值' AND team = 999 AND touch IS NULL)
我期望这与:
没有 WHERE 子句
减
(部门 = '免费增值' AND team = 999 AND touch IS NULL)
但事实并非如此。从计数来看,存在一些差异。有什么见解吗?
仅供引用,我正在使用 HiveQL,但不要指望这对于 MySQL/SQL 会有任何不同。
补充:
原始查询:
CREATE TABLE AS example_so AS
SELECT
ticket_id,
division,
team,
touch
FROM sample_table
WHERE
day >= '2016-01-01' AND
current_state <> 'deleted'
GROUP BY
ticket_id,
division,
team,
touch;
查询A:
SELECT
COUNT(DISTINCT ticket_id)
FROM example_so
结果:81,336
查询B:
SELECT
COUNT(DISTINCT ticket_id)
FROM example_so
WHERE
(team = 999 AND division = 'Freemium' AND touch IS NULL)
结果:355
查询C:
SELECT
COUNT(DISTINCT ticket_id)
FROM example_so
WHERE
NOT (team = 999 AND division = 'Freemium' AND touch IS NULL)
结果:80,682
最佳答案
要检查MySQL中的空值,您需要使用IS NULL。
因此对于 team is null
的行, team 不等于 999,也不等于 "not equal"
到 999 也不会,因为它是空的。
为了更好地理解这一点,请尝试运行此查询:
select a from (select null as a)a where (a<>1)
它将返回 0 行。
所以原因是count(table C) + Count(table B) <> count(table A)
是查询 B 和 C 都不包含 null
的团队,而查询 A 则如此。
基本上,尽量避免使用 where
逻辑条件NOT
因为它可能会非常令人困惑,并尝试否定你的表达。
喜欢:
NOT (division = 'Freemium' AND team = 999 AND touch IS NULL)
应该是:
(division <> 'Freemium' or division is null
or team <> 999 or team is null or touch IS NOT NULL)
关于sql - 逻辑运算符不在括号之外返回令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222606/