BigQuery COUNT(*) ... WHERE NOT (...) returns 令人困惑的结果
BigQuery COUNT(*) ... WHERE NOT (...) returns confusing results
我有一个 table 和 device
列,它可以是 'P'、'T' 或 NULL,但是像 device NOT IN('P', 'T')
这样的条件似乎错过了带有 NULL 的行。可以通过以下查询进行演示
$ bq query 'SELECT count(*) FROM t'
+----------+
| f0_ |
+----------+
| 29542063 |
+----------+
$ bq query "SELECT count(*) FROM t WHERE device = 'P' OR device = 'T'"
+---------+
| f0_ |
+---------+
| 8268436 |
+---------+
$ bq query "SELECT count(*) FROM t WHERE NOT (device = 'P' OR device = 'T')"
+-----+
| f0_ |
+-----+
| 0 |
+-----+
$ bq query "SELECT count(*) FROM t WHERE device IS NULL"
+----------+
| f0_ |
+----------+
| 21273627 |
+----------+
为什么查询 WHERE NOT
returns 0
而 IS NULL
一个 returns 正确的结果?
"Why the query with WHERE NOT returns 0 while IS NULL one returns correct result?"
因为
SELECT null != 'anything'
returns'null',不是'false'。
我有一个 table 和 device
列,它可以是 'P'、'T' 或 NULL,但是像 device NOT IN('P', 'T')
这样的条件似乎错过了带有 NULL 的行。可以通过以下查询进行演示
$ bq query 'SELECT count(*) FROM t'
+----------+
| f0_ |
+----------+
| 29542063 |
+----------+
$ bq query "SELECT count(*) FROM t WHERE device = 'P' OR device = 'T'"
+---------+
| f0_ |
+---------+
| 8268436 |
+---------+
$ bq query "SELECT count(*) FROM t WHERE NOT (device = 'P' OR device = 'T')"
+-----+
| f0_ |
+-----+
| 0 |
+-----+
$ bq query "SELECT count(*) FROM t WHERE device IS NULL"
+----------+
| f0_ |
+----------+
| 21273627 |
+----------+
为什么查询 WHERE NOT
returns 0
而 IS NULL
一个 returns 正确的结果?
"Why the query with WHERE NOT returns 0 while IS NULL one returns correct result?"
因为
SELECT null != 'anything'
returns'null',不是'false'。