0

所以我知道mysql说:

通常,包含 NULL 值的表和空表是“极端情况”。编写子查询时,请始终考虑是否考虑了这两种可能性。 http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

但这没有意义。如果我说:

select * from users where users.id NOT IN (NULL);

它不应该返回所有用户吗?即使按照他们自己的逻辑:

NOT IN 是 <> ALL 的别名。因此,这两个语句是相同的:

对我来说,返回所有 id 不等于 NULL 的记录,即所有记录。

所以问题是,我怎样才能实现选择不在特定集合中的所有记录,即使该集合是空的

显然,在我的应用程序代码(Rails 应用程序)中,我可以检查集合是否为空并修改我的查询,但这似乎很荒谬。有没有办法在 sql 中完成这一切?

4

1 回答 1

2

您犯了假设 that NULLis 或 has a value 的常见错误 - 在这种情况下,您假设NULL = empty set.

NULL表示未定义 - 所以在所有 RDMSNULL = NULL中 isNULLNULL <> NULLis also NULL。事Anything = NULLNULL至此Anything <> NULLNULL在 RDMS 中与数学中的除零相同。

这就是为什么您必须使用特殊的比较运算符IS NULL而不是=.

因此,您构建的查询将转换为select * from users where users.id NOT IN (undefined)。而users.id NOT IN (undefined)本身就是undefined

我假设NULL你的查询来自 Rails 中的一个变量——我称之为 pnl(可能是空列表)。所以这个查询会给你你想要的。

select * from users where users.id NOT IN (pnl) OR pnl IS NULL;
于 2013-03-21T05:08:34.753 回答