sqlite 了解如何在GROUP BY和WHERE子句中处理NULL?

lzfw57am  于 2023-01-17  发布在  SQLite
关注(0)|答案(1)|浏览(166)

在尝试隔离下面第一个查询中的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
vc6uscn9

vc6uscn91#

SQL中的布尔表达式计算结果为truefalsenull
任何SQL语句的WHERE子句都会过滤掉布尔表达式/条件为nottrue的所有行,即过滤掉falsenull
所有这些布尔表达式:

null != ''
null = ''
null not in ('A', 'H')

的计算结果为nulldemo),因为在不使用运算符IS的情况下对/与null进行任何比较都会返回null
这就是为什么您的第二、第三和第四个查询不仅过滤掉不满足WHERE子句中条件的行,而且过滤掉c等于null的行。
如果您希望这些行中的c等于null,则必须明确说明:

c != '' OR c IS NULL
c = '' OR c IS NULL
c not in ('A', 'H') OR c IS NULL

或者,对于前两种情况,可以使用运算符IS

c IS NOT ''
c IS ''

相关问题