sql - 逻辑运算符不在括号之外返回令人困惑的结果

标签 sql hiveql

我有以下 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/

相关文章:

sql - WCF 服务中的 TPL 任务无法使用正确的 IIS 安全凭据(SQL 连接)

sql - 从 SQL 数据库中删除元组

php - 是否存在这样的 SQL 查询?

mysql - 根据另一列中给出的季度查询列中的四分之一百分比

hadoop - 从 Hive 的列表中查找最大值

hadoop - HBase到Hive集成失败

apache-spark - 尝试使用 Spark 处理 Hive 表时出现 "Unable to instantiate SparkSession with Hive support"错误

sql - 按某些列 SQL 进行透视(转置)

mysql - Hive 中的高效子查询

hive - 计算 Hive 中不包括星期日的天数