所以我知道 mysql 说:
In general, tables containing NULL values and empty tables are “edge cases.” When writing subqueries, always consider whether you have taken those two possibilities into account. http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html
但这没有意义。如果我说:
从 users.id NOT IN (NULL) 的用户中选择 *
;
它不应该返回所有用户吗?即使按照他们自己的逻辑:
NOT IN is an alias for <> ALL. Thus, these two statements are the same:
对我来说,返回 id 不等于 NULL 的所有记录,即所有记录。
所以问题是,如何实现选择不在特定集合中的所有记录,即使该集合为空。
显然,在我的应用程序代码(Rails 应用程序)中,我可以检查集合是否为空并修改我的查询,但这看起来很荒谬。有什么办法可以在 sql 中完成这一切吗?
最佳答案
您犯了一个常见的错误,即假设 NULL
是或有一个值 - 在这种情况下,您假设 NULL = empty set
。
NULL
意味着未定义 - 所以在所有 RDMS 中 NULL = NULL
是 NULL
和NULL <> NULL
也是NULL
。就此而言Anything = NULL
是 NULL
原样Anything <> NULL
。 NULL
RDMS 中的除数与数学中的除零相同。
这就是为什么你必须使用特殊的比较运算符 IS NULL
而不是=
.
因此,您构建的查询将转换为 select * from users where users.id NOT IN (
未定义 )
。和users.id NOT IN (
未定义 )
本身未定义。
我假设 NULL
您的查询来自 Rails 中的变量 - 我将其称为 pnl (可能为空列表)。所以这个查询会给你你想要的。
select * from users where users.id NOT IN (pnl) OR pnl IS NULL;
关于mysql - 有没有办法查询 mysql 中不在集合中的所有记录,即使它是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15539599/