sql - 无法根据“不在其中”进行过滤
问题描述
我有一个带有两个表的 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
是执行我正在尝试做的事情的标准方法。我究竟做错了什么?
解决方案
原因是id
intable2
包含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
并且您不会得到任何结果。
推荐阅读
- python - asyncio.sleep 阻塞了?
- reactjs - 基于按钮单击打开独特的模式或弹出器
- julia - 为什么 Julia 函数名(不带参数)会被静默忽略?
- android-studio - 我想知道如何在 android studio 中制作一个浮动按钮,即使在关闭活动后仍保留在屏幕上
- javascript - 返回具有特定顺序的特定索引处的数字的数组的函数
- php - Apache 服务器上的 websocket 配置文件
- java - 如何从蓝图(Camel-http)动态设置 HTTP 方法
- javascript - 如何根据那里的键在平面列表中选择多个值
- android - Java android通过蓝牙连接到设备
- c - 内核 4.x 中的 dnotify 是否已过时?