在尝试隔离下面第一个查询中的7行时,作为一个新手,我得到了出乎意料的结果。我仔细阅读了此SQLite document,但不明白为什么在第一个查询中,7行NULL在GROUP BY中被分隔,但在!= ''
、not in ('A','H')
和=''
上进行的测试都排除了NULL行。
看起来好像这些测试是互斥的,例如NULL不是=''
就是!=''
,或者是in ('A','H')
就是not in ('A','H')
。所有这些测试似乎都忽略了NULL,但它在GROUP BY中被分隔开。
你能解释一下为什么会这样吗?
谢谢你。
sqlite> select substr(trim(grammarCode),1,1) as c, count(indexRow) as cnt
from tbl
group by c
order by cnt;
c cnt
- ------
7
A 4828
20046
H 300679
sqlite> select substr(trim(grammarCode),1,1) as c, count(indexRow) as cnt
from tbl
where c != ''
group by c
order by cnt;
c cnt
- ------
A 4828
H 300679
sqlite> select substr(trim(grammarCode),1,1) as c, count(indexRow) as cnt
from tbl
where c not in ('A', 'H')
group by c
order by cnt;
c cnt
- ------
20046
sqlite> select substr(trim(grammarCode),1,1) as c, count(indexRow) as cnt
from tbl
where c = ''
group by c
order by cnt;
c cnt
- ------
20046
sqlite> select substr(trim(grammarCode),1,1) as c, count(indexRow) as cnt
from tbl
where c is null
group by c
order by cnt;
c cnt
- ------
7
1条答案
按热度按时间vc6uscn91#
SQL中的布尔表达式计算结果为
true
、false
或null
。任何SQL语句的
WHERE
子句都会过滤掉布尔表达式/条件为nottrue
的所有行,即过滤掉false
和null
。所有这些布尔表达式:
的计算结果为
null
(demo),因为在不使用运算符IS
的情况下对/与null
进行任何比较都会返回null
。这就是为什么您的第二、第三和第四个查询不仅过滤掉不满足
WHERE
子句中条件的行,而且过滤掉c
等于null
的行。如果您希望这些行中的
c
等于null
,则必须明确说明:或者,对于前两种情况,可以使用运算符
IS
: