首页 > 解决方案 > 无法根据“不在其中”进行过滤

问题描述

我有一个带有两个表的 SQLite 数据库,每个表都有 row id。我正在尝试根据表 2 中没有的内容过滤表 1 中的数据。表 1 有,例如:

In: SELECT id FROM table1 LIMIT 4
Out: 
'0000001'
'0000002
'0000003'
'0000004'

并且 table2 有:

In: SELECT id FROM table2 LIMIT 10
Out: 
None
None
None
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'
'0001098'

我想从table1返回id列不在table2中的所有值,我尝试这样做:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2)

但这不返回任何值。如果我使用SELECT id FROM table1 EXCEPT SELECT id FROM table2,它工作正常。据我了解,这WHERE COLUMN NOT IN是执行我正在尝试做的事情的标准方法。我究竟做错了什么?

标签: sqlsqlite

解决方案


原因是idintable2包含null值。
如果你使用这个:

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2 WHERE id IS NOT null)

它会起作用的。我在SQLite文档
中没有找到有关此案例的任何内容,但对于MySQL,来自: https ://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in

为了符合 SQL 标准,IN 不仅在左侧的表达式为 NULL 时返回 NULL,而且在列表中未找到匹配项且列表中的表达式之一为 NULL 时返回 NULL

所以这是 SQL 标准,这意味着在您的情况下,语句:

IN (SELECT id FROM table2)

返回NULL然后

NOT IN (SELECT id FROM table2)

也返回NULL
因此,您的条件不会评估为TRUE并且您不会得到任何结果。


推荐阅读